【问题标题】:Get the Nth element with XPath - when element[N] fails使用 XPath 获取第 N 个元素 - 当 element[N] 失败时
【发布时间】:2014-06-30 21:41:20
【问题描述】:

关于 XPath 中的第 N 个元素已经有一些讨论:

XPath query to get nth instance of an element

Get Nth child of a node using xpath

XPath and PHP: Parse from the nth instance of an element

我正在使用 Selenium 和 PHPUnit 进行功能测试。我的问题是,在具有大表单的页面上,第 N 个选择器不起作用。我有 80 个输入字段(使用 Selenium 的 getXpathCount('//input') 调用来获取确切的数字) - 我想遍历这 80 个字段并输入一些文本。 我已经尝试过但不起作用(N 是索引变量):

//input[N]
//input[position()=N]
input[N]
(//input)[N]
(.//input)[N]
css=input:nth-of-type(N)

以及以上所有的混合物。它通常会触发一个异常,说:在 N = 2 处找不到元素。我尝试了几个用于浏览器的 XPath 工具,因此作为 Chrome 中的 XPathEvaluator 等原生扩展 - 几乎所有的都给了我正确的结果。所以看起来 Seleniums XPath 解析器的工作方式有点不同。

你怎么看?我错过了什么重要的事情吗?

更新: 这是我的解决方案: getAllFields(): http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/java/com/thoughtworks/selenium/DefaultSelenium.html#getAllFields() 然后我遍历。

它实际上并没有解决原来的问题,所以我仍然对答案感兴趣。

谢谢!

【问题讨论】:

  • 我很确定 Selenium 不提供完整的标准 XPath。但我现在无法确定证据,除了你刚刚发布的。你的表达式 (//input)[N] 应该可以工作。
  • @LarsH:Selenium RC API 可能无法正确支持 XPath 1.0 的某些部分,但我不知道。我确实多次使用过这类东西的 XPath 版本,而且它们工作得很好。
  • @Ross:很高兴知道。以后我会留意例外情况,因为我没有提供任何具体信息。

标签: phpunit selenium-rc xpath


【解决方案1】:

(//input)[15] 返回文档中的第 15 个输入元素

//input[15] 返回每​​个输入元素,它是其父元素的第 15 个输入子元素。

所以你的一些表达至少是不正确的。但它们并不都是不正确的,所以我不知道为什么它不适合你。

【讨论】:

  • @itarato,Michael 表示在标准 XPath 中(不一定在 Selenium XPath 中)。
  • 当然,我也知道这一点。我只是在到处虚张声势。
  • @LarsH:在 Selenium 中的意思是一样的。
  • 天啊。从来没有意识到您必须/可以将 xpath 结果包装在括号中以获取第 n 个元素。正在挠头想为什么第二个变种不起作用! (与//div[@class='blah'] 类型的属性选择结合使用。没有它我得到多个
【解决方案2】:

没有看到您的特定代码和 HTML,我们主要是在这里猜测。但是xpath=(//input)[2] 会在页面上找到第二个输入字段,无论它在哪里。一定要包含xpath=,因为除非定位器以// 开头,否则Selenium RC 不会假设它。另请注意,在 XPath 中,n 从 1 开始,而不是像在 C 派生语言中那样从 0 开始。

【讨论】:

    【解决方案3】:

    这个对我有用:

    /descendant::input[@id="search_query"][2]

    另见this answer

    【讨论】:

      【解决方案4】:

      我不使用 PHPUnit,但我喜欢 XPath。

      在 Safari 检查器的搜索字段中:

      //input[N]
      

      或作用域:

      //div/input[N]    means second input in a div
      (//div/input)[N]  means second div that has an input (select the first input)
      

      【讨论】:

      • 我得到的是: //input[1] = all inputs //input[2] = empty 在我的情况下,输入字段没有共同的父级。
      • 这是因为//input[1] 的意思是“文档中的任何位置 (//),任何输入元素 (input) 是其父元素 ([1]) 的第一个子元素”。与大多数受过 C 培训的程序员所期望的相反,[1] 并不意味着“集合的第一个输入元素”,而是position() = 1 的缩写。它适用于(//input)[1],因为(//input) 是所有输入元素的集合,position() 适用于该集合。而在//input[1] 中,position() 适用于元素。
      • 我能够利用这个解决方案:(.//*[@id='myID']/tbody/tr[2]/td[4]/a)[1] where [4 ] 是列号,[1] 是行号。
      猜你喜欢
      • 2021-10-03
      • 2012-02-02
      • 2010-10-16
      • 2011-04-29
      • 2018-08-07
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多