Программно редактировать содержимое CodeMirror без доступа к объекту

Я использую Selenium для запуска автоматических тестов на странице, содержащей редактор CodeMirror. У меня нет доступа к объекту, но у меня есть jQuery. Как изменить содержимое редактора таким образом, чтобы CodeMirror распознал изменение?

Ответ 1

Оберточный элемент div DOM (с классом CodeMirror) будет иметь свойство CodeMirror, которое ссылается на объект экземпляра редактора. Вы можете вызвать setValue на этом.

Ответ 2

Проводя это здесь, так как выбранный ответ помог мне, но мне не хватило некоторой информации, чтобы полностью решить мою проблему (в основном из-за того, что я не знал JavaScript или как взаимодействовать с свойствами WebElement). Так будет выглядеть код для Selenium/Java:

WebDriver driver = new FirefoxDriver();
WebElement queryInput = driver.findElement(By.cssSelector("div[class='CodeMirror']"));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].CodeMirror.setValue(\"" + query + "\");", queryInput);

Ответ 3

@user3233451 - в моем случае мне пришлось ссылаться на правильный веб-элемент, например: By.cssSelector(". CodeMirror").

Кроме того, у меня было два веб-элемента CodeMirror на странице, поэтому я сделал следующее:

    //declare codemirror variable
    private By codeMirrorWebElement = By.cssselector(".CodeMirror");

    //use Javascript executor to access each code mirror element via its respective index
    ((JavascriptExecutor) driver).executeScript("arguments[0].CodeMirror.setValue( '"+ query1 + "');", driver.findElements(codeMirrorWebElement).get(0));
    ((JavascriptExecutor) driver).executeScript("arguments[0].CodeMirror.setValue( '"+ query1 + "');", driver.findElements(codeMirrorWebElement).get(1));

Ответ 4

Это не сработало для меня...

driver.findElement(By.cssSelector("div[class='CodeMirror']"))

Но это сделал...

driver.findElement(By.className('CodeMirror'))

Итак, мой код закончился как:

WebElement codeMirror driver.findElement(By.cssSelector("div[class='CodeMirror']"))
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].CodeMirror.setValue(\"" + sqlValue + "\");", codeMirror);

Ответ 5

Ответы других пользователей верны, но если вместо замены значения codemirror вы хотите отправлять события клавиатуры, вы можете сделать что-то вроде этого:

/* getting codemirror element */
WebElement codeMirror = driver.findElement(By.className("CodeMirror"));

/* getting the first line of code inside codemirror and clicking it to bring it in focus */
WebElement codeLine = codeMirror.findElements(By.className("CodeMirror-line")).get(0);
codeLine.click();

/* sending keystokes to textarea once codemirror is in focus */
WebElement txtbx = codeMirror.findElement(By.cssSelector("textarea"));
txtbx.sendKeys("Hello World");

Чтобы selenium распознавал события клавиатуры, сначала нужно сфокусировать кодовое зеркало.