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