所以我一直在Selenium代码中使用JavascriptExecutor类,因为Javascript似乎比Selenium更优雅地处理DOM操作。我使用XPaths定位元素,而Javascript处理XPaths的方式就是以下代码行(请注意,“ xpath”是将包含所需XPath字符串的变量):
document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
除了一种情况,这在所有XPath的JavascriptExecutor中均能正常工作
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中正确返回,而其他元素返回null。
答案 0 :(得分:0)
所以问题是我没有在执行第一个JavascriptExecutor后实例化它。除非您实例化一个新实例,否则以后每次使用JavascriptExecutor都会失败。