我尝试编写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问题,还是我错误地阅读了规范?我可以做些什么来缩短表达方式?
答案 0 :(得分:25)
这是一个问题:
//input[@name='question'][7]
此表达式根本不起作用。
这是常见问题解答。
[]
的优先级高于//
。
上面的表达式选择input
每个@name = 'question'
元素,这是其父级的第7个子级 - 并且显然是文档中未显示的input
个元素的父级没有input
个孩子。
使用(注意括号):
(//input[@name='question'])[7]
这将选择文档中满足谓词条件的第7个元素input
。
修改强>:
知道Selenium(Dave Hunt)的人建议将上述表达式写成Selenium:
xpath=(//input[@name='question'])[7]
答案 1 :(得分:6)
如果您希望源中包含值为input
的{{1}} name
属性为question
,请尝试以下操作:
/descendant::input[@name='question'][7]