使用XPath获取第N个元素 - 当元素[N]失败时

时间:2011-10-06 10:19:17

标签: phpunit selenium-rc xpath

已经讨论过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)

以上所有的混合物。它通常会触发一个Exception说:在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()然后我遍历。

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

谢谢!

4 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

这个对我有用:

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

另见this answer

答案 3 :(得分:-1)

我不使用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)