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