Ответ 1
Оберточный элемент div
DOM (с классом CodeMirror
) будет иметь свойство CodeMirror
, которое ссылается на объект экземпляра редактора. Вы можете вызвать setValue
на этом.
Я использую Selenium для запуска автоматических тестов на странице, содержащей редактор CodeMirror. У меня нет доступа к объекту, но у меня есть jQuery. Как изменить содержимое редактора таким образом, чтобы CodeMirror распознал изменение?
Оберточный элемент div
DOM (с классом CodeMirror
) будет иметь свойство CodeMirror
, которое ссылается на объект экземпляра редактора. Вы можете вызвать setValue
на этом.
Проводя это здесь, так как выбранный ответ помог мне, но мне не хватило некоторой информации, чтобы полностью решить мою проблему (в основном из-за того, что я не знал 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);
@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));
Это не сработало для меня...
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);
Ответы других пользователей верны, но если вместо замены значения 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 распознавал события клавиатуры, сначала нужно сфокусировать кодовое зеркало.