【发布时间】:2018-06-14 00:31:51
【问题描述】:
鉴于我有以下 XPath:
//table[@title="someTitle"]//td[@id="someId"][3]
当我尝试使用 WebDriver 的 element(By.xpath(someXpathString)).click(); 点击这个元素时我得到“ElementNotFound”异常。
但是,当我尝试使用 SAME XPath 但使用 Chrome DevTools 中的控制台查找元素时,它会准确返回我正在寻找的元素。调用如下所示:
$x('//table[@title="someTitle"]//td[@id="someId"][3]');
现在,我知道如果我使用这个 XPath:
(//table[@title="someTitle"]//td[@id="someId"])[3]
在 WebDriver 中,找到该元素并单击有效。
- 请注意,我希望能够通过该选择器找到第二个、第三个甚至第四个元素。这是与同一列但不同行上的表格单元格交互的解决方法。
我的问题是:为什么 Chrome 控制台使用 XPath不带括号 识别元素而 Find 功能不能识别,这两个 XPath 之间的实际区别是什么?
我注意到其他元素不需要括号符号来选择该类型的第二个或更高的元素,所以我想清楚地解释这种类型的 XPath 是如何工作的,背后的逻辑是什么它。
【问题讨论】:
-
能分享一下 selenium 和 jquery 的代码 sn-ps 吗?你确定没有错别字?
-
我不能真正分享实际代码(公司政策),但是是的,我确信没有错别字。带有括号的完全相同的 XPath 可以工作,没有括号它会给出未找到元素的异常。事实上,我已经在 Chrome 上使用 DevTools 进行了测试,同样的事情发生了,如果不使用元素编号前的括号,则不会选择元素。
-
$x不是 jQuery,它是浏览器内置的用于评估 xpath 的实用程序 -
@derloopkat 好的,但它是相同的 XPath 表达式,仍然无法解释为什么需要括号。我已经在 FireFox 和 Chrome 上测试过了。 Find 和 $x 都以相同的方式计算表达式是有道理的,因为它们都在 Chrome 上工作。
-
@SorinD.,然后编辑您的问题。 jQuery 选择器是 Sizzle,而不是 XPath。您正在使用控制台来评估这些 XPath,而不是 jQuery。