Я использую Selenium для запуска автоматических тестов на странице, содержащей редактор CodeMirror. У меня нет доступа к объекту, но у меня есть jQuery. Как изменить содержимое редактора таким образом, чтобы CodeMirror распознал изменение?
Программно редактировать содержимое 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 распознавал события клавиатуры, сначала нужно сфокусировать кодовое зеркало.