为什么这个 Javascript 在浏览器控制台中有效,但在 Selenium 的 Javascript 执行器中无效?

Why does this Javascript work in the browser console but not in Selenium's JavascriptExecutor?

所以我一直在我的 Selenium 代码中使用 JavascriptExecutor class,因为 Javascript 似乎比 Selenium 更优雅地处理 DOM 操作。我使用 XPaths 来定位我的元素,Javascript 处理 XPaths 的方式是使用这行代码(注意 '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]”等)。在浏览器控制台中,这些工作正常。

所以我的问题是,"why doesn't this Javascript code, that clearly works in the browser console, work in the JavascriptExecutor?"

我的 DOM 场景是我有 6 个 <a> 元素具有相同的父元素 <div class='aclass'>。 Javascript return 的 6 个元素中的每一个在浏览器控制台中都正确地对应于其具有 XPath "(//div[@class='aclass']//a)[index]" 的索引,但只有第一个元素 return 在 Javascript执行者而其他人return null.

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