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

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


person ajnatural    schedule 18.02.2014    source источник
comment
Если кто-то будет искать способ Python-Selenium для работы с редакторами CodeMirror, вот пример.   -  person alecxe    schedule 28.12.2015


Ответы (5)


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

person Marijn    schedule 18.02.2014

Публикация этого здесь, так как выбранный ответ помог мне, но мне не хватило некоторой информации, чтобы полностью решить мою проблему (в основном из-за того, что я не знал 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);
person user3446958    schedule 17.12.2015
comment
Я получаю аргументы [0].CodeMirror не определен. - person user3233451; 23.01.2017

Ответы, отправленные другими, верны, но если вместо замены значения 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.

person Abhishek Hingorani    schedule 23.08.2019

@ 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));
person a_myze    schedule 29.03.2018

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

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);
person John Camerin    schedule 14.10.2018