Почему этот Javascript работает в консоли браузера, а не в Selenium JavascriptExecutor? - PullRequest
0 голосов
/ 13 декабря 2018

Так что я использовал класс JavascriptExecutor в своем коде Selenium, потому что Javascript, кажется, обрабатывает DOM-манипуляции более изящно, чем Selenium.Я использую XPath для определения местоположения своих элементов, и Javascript обрабатывает XPath с этой строкой кода (обратите внимание, что «xpath» - это переменная, которая будет содержать желаемую строку XPath):

document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

Это сработало нормальнов JavascriptExecutor для всех XPath, кроме одного случая:

WebDriver driver = new ChromeDriver();
driver.get("example.com");
JavascriptExecutor js = (JavascriptExecutor) driver;
String xpath = "(//div[@class='aclass']//a)[2]";
String javascript = "return document.evaluate(arguments[0], document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue";
WebElement element = js.executeScript(javascript, xpath);
element.click();

Тот же самый xpath, использованный выше, работает в консоли браузера, но не в JavascriptExecutor.Обратите внимание на «[2]».Если значение индекса равно «[1]», оно работает в JavascriptExecutor;но любое значение выше этого значения не работает (например, «[2]», «[3]», «[4]», «[5]» и т. д.).В консоли браузера они работают нормально.

Итак, мой вопрос: "почему этот код Javascript, который четко работает в консоли браузера, не работает в JavascriptExecutor?"

Сценарий моего DOM состоит в том, что у меня есть 6 <a> элементов, которые имеют один и тот же родительский элемент <div class='aclass'>.Javascript возвращает каждый из 6 элементов правильно в консоли браузера в соответствии с его индексом с XPath "(//div[@class='aclass']//a)[index]", но только первый элемент правильно возвращает в JavascriptExecutor, в то время как другие возвращают ноль.

1 Ответ

0 голосов
/ 13 декабря 2018

Так что проблема в том, что я не создавал новый JavascriptExecutor после выполнения первого.Каждое последующее использование JavascriptExecutor завершается ошибкой, если вы не создадите новый экземпляр.

...