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

Phpunit 使用XPath获取第N个元素-当元素[N]失败时,phpunit,selenium-rc,xpath,Phpunit,Selenium Rc,Xpath,已经有一些关于XPath中第n个元素的讨论: 我正在使用Selenium和PHPUnit进行功能测试。我的问题是,在具有大表单的页面上,第n个选择器不起作用。我有80个输入字段(使用Selenium的getXpathCount('//input')调用来获得确切的数字),我想遍历这80个字段并键入一些文本。 我已经尝试但不起作用的内容(N是索引变量): 以及上面所有的混合物。它通常触发一个异常,表示:在N=2处找不到元素。我尝试了几种用于浏览器的XPath工具,所以像Chrome中的XPa

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

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

以及上面所有的混合物。它通常触发一个异常,表示:在N=2处找不到元素。我尝试了几种用于浏览器的XPath工具,所以像Chrome中的XPathEvaluator这样的本机扩展几乎都给了我正确的结果。所以Seleniums XPath解析器的工作方式似乎有点不同

你觉得怎么样?我错过了一件大事吗

更新: 这是我的解决方案: getAllFields():然后我遍历

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


谢谢

我不使用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)[15]
返回文档中的第15个输入元素


//input[15]
返回作为其父元素的第15个输入子元素的每个输入元素


所以你的一些表达至少是不正确的。但它们并不都是错误的,所以我不知道为什么它对你不起作用

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

这一点对我很有用:

/genderant::input[@id=“search\u query”][2]


另请参见

我得到的是://input[1]=所有输入//input[2]=空。在我的例子中,没有输入字段的公共父项。这是因为//input[1]表示“文档中的任何地方(
///code>),任何输入元素(
input
)都是其父元素(
[1]
)的第一个子元素。”。与大多数受过C语言培训的程序员所期望的相反,
[1]
并不意味着“集合的第一个输入元素”,而是
position()=1
的缩写。它适用于
(//输入)[1]
,因为
(//输入)
是所有输入元素的集合,并且
位置()
应用于该集合。而在
///input[1]
中,
position()
应用于元素。我能够利用这个解决方案:(../*[@id='myID']/tbody/tr[2]/td[4]/a)[1],其中[4]是列号,[1]是行号。@itarato,Michael在标准XPath中的意思是(在Selenium XPath中不一定如此)。当然,我也知道这一点。我只是在虚张声势。@LarsH:在Selenium中的意思是一样的。我很确定Selenium没有提供完整的、标准的XPath。但除了你刚才发布的内容,我现在无法找到证据。您的表达式
(//input)[N]
应该可以工作。@LarsH:可能有XPath 1.0的某些部分Selenium RC API不正确支持,但我不知道有任何部分。我当然已经多次使用过这类东西的XPath版本,它们工作得很好。@Ross:很高兴知道。我会留意未来的例外情况,因为我没有任何细节可以提供。
//div/input[N]    means second input in a div
(//div/input)[N]  means second div that has an input (select the first input)