为什么此Javascript在浏览器控制台中有效,但在Selenium的JavascriptExecutor中却无效?

时间:2018-12-13 15:54:16

标签: javascript java selenium xpath javascript-injection

所以我一直在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。

1 个答案:

答案 0 :(得分:0)

所以问题是我没有在执行第一个JavascriptExecutor后实例化它。除非您实例化一个新实例,否则以后每次使用JavascriptExecutor都会失败。