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

Posted

技术标签:

【中文标题】无法在 Selenium 中获取第 n 个节点【英文标题】:Can't get nth node in Selenium 【发布时间】:2011-03-23 02:40:52 【问题描述】:

我尝试编写 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中的位置过滤,所以它必须找到名为'question'的第七个input。在 Selenium 中,这不起作用。 CSS 选择器 (:nth-of-kind) 也没有。

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

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

这是特定于 Selenium 的问题,还是我以错误的方式阅读规范?我该怎么做才能使表达式更短?

【问题讨论】:

【参考方案1】:

这里有个问题:

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

这个表达式根本不起作用。

这是一个常见问题解答

[] 的优先级高于//

上面的表达式选择每个input元素和@name = 'question',这是其父元素的第7个子元素——显然文档中未显示的input元素的父元素没有那么多@ 987654327@儿童。

使用(注意括号):

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

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

编辑

了解 Selenium 的人(Dave Hunt)建议将上面的表达式用 Selenium 写成:

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

【讨论】:

我以前试过这个:(//input[@name='question'])[2], error = Error: Element (//input[@name='question']) [2] 未找到 @culebrón:可能这就是 Selenium 在 XPath 表达式没有选择任何内容时的反应方式。如果文档中具有 attr 的 input 元素少于两个,则此 XPath 表达式不会选择任何节点。 name 具有值 'question' 然后使用 Dave Hunt 的答案——这更有可能得到 Selenium 所谓的“XPath”的支持。 请注意,如果定位器以 //xpath= 开头,Selenium 只会将定位器解释为 XPath,因此以 ( 开头将默认尝试通过标识符(idname). @Dave-Hunt:那么,xpath=(//input[@name='question'])[7] 会被接受吗?【参考方案2】:

如果您希望源中的第 7 个 input 属性为 name 且值为 question,请尝试以下操作:

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

【讨论】:

我很确定 //descendant-or-self:: 的同义词,所以我认为这不会有帮助。 你是对的,但descendant-or-self 不是descendant 的直接同义词。见w3.org/TR/xpath/#path-abbrev"注:定位路径//para[1]与定位路径/descendant::para[1]的含义不同。后者选择第一个后代para元素;前者选择所有后代para元素是第一个para 父母的孩子。”

以上是关于无法在 Selenium 中获取第 n 个节点的主要内容,如果未能解决你的问题,请参考以下文章

如何从单向链表的尾部获取第 n 个节点(一次遍历)?

Selenium CSS 选择器,用于第 n 次出现 td span:nth-child(2)

在selenium2中,如何获取一个父节点下子节点的个数,所有的子节点的内容都有MOON

主要功能未执行我的第二个功能

Python selenium —— 父子兄弟相邻节点定位方式详解

无法使用 selenium python 获取多个跨度类文本