【问题标题】:XPath not found by Selenium but works with jQuerySelenium 找不到 XPath,但可以与 jQuery 一起使用
【发布时间】: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。

标签: selenium xpath


【解决方案1】:

两个 xpath 不同。

  1. //table[@title="someTitle"]//td[@id="someId"][3] -- 将只选择 3 个列元素
  2. (//table[@title="someTitle"]//td[@id="someId"])[3] -- 选择所有列,然后只返回一个索引为 3 的元素。

例如,假设有 4 行 4 列的表。 第一个 xpath 仅选择每行第三列中的元素(共 4 个)。 但第二个 xpath 只选择一个元素,即第 1 行的第 3 列,与表中的行数无关。

如果我们使用 find 元素,两者都只会返回一个元素。但是如果我们使用 find 元素,第一个将返回 4 个元素,而第二个 xpath 只返回一个元素。

【讨论】:

  • 现在说得通了,谢谢!当我尝试使用 [1] 进行搜索时,我感到困惑,并且它在两种情况下都有效,所以我无法理解原因。
【解决方案2】:

如果您要从另一个页面转到元素所在的页面,请尝试刷新 -

driver.navigate().refresh();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多