无法在Selenium中获得第n个节点

时间:2010-07-30 07:11:11

标签: xpath selenium css-selectors

我尝试编写xpath表达式,以便我的测试不会被小的设计更改破坏。因此,不是Selenium IDE生成的表达式,而是编写自己的表达式。

这是一个问题:

//input[@name='question'][7]

此表达式根本不起作用。名为“问题”的输入节点分布在整个页面上。他们不是兄弟姐妹。

我尝试过使用中间表达式,但也失败了。

(//input[@name='question'])[2]
error = Error: Element (//input[@name='question'])[2] not found

这就是为什么我认为Seleniun错误地实现了XPath。

根据XPath docs,位置谓词必须按 nodeset 中的位置进行过滤,因此必须找到名为input的第七个'question'。在Selenium中,这不起作用。 CSS选择器(:nth-of-kind)也没有。

我必须写一个过滤他们共同父母的表达式:

//*[contains(@class, 'question_section')][7]//input[@name='question']

这是一个特定的Selenium问题,还是我错误地阅读了规范?我可以做些什么来缩短表达方式?

2 个答案:

答案 0 :(得分:25)

  

这是一个问题:

//input[@name='question'][7]   
     

此表达式根本不起作用。

这是常见问题解答

[]的优先级高于//

上面的表达式选择input每个@name = 'question'元素,这是其父级的第7个子级 - 并且显然是文档中未显示的input个元素的父级没有input个孩子。

使用(注意括号):

(//input[@name='question'])[7]

这将选择文档中满足谓词条件的第7个元素input

修改

知道Selenium(Da​​ve Hunt)的人建议将上述表达式写成Selenium:

xpath=(//input[@name='question'])[7]

答案 1 :(得分:6)

如果您希望源中包含值为input的{​​{1}} name属性为question,请尝试以下操作:

/descendant::input[@name='question'][7]