首页 文章

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

提问于
浏览
16

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

这是一个问题:

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

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

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

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

这就是为什么我认为Seleniun有一个错误的XPath实现 .

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

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

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

这是一个特定的Selenium问题,还是我错误地阅读了规范?我该怎么做才能缩短表达方式?

2 回答

  • 6

    这是一个问题://输入[@ name ='question'] [7]
    这个表达式根本不起作用 .

    This is a FAQ .

    [] 的优先级高于 // .

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

    Use (注意括号):

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

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

    Edit

    知道Selenium的人(Dave Hunt)认为上述表达式是用Selenium编写的:

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

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

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

相关问题