【问题标题】:XPath element number returns all elements instead than firstXPath 元素编号返回所有元素而不是第一个
【发布时间】:2012-04-30 15:41:00
【问题描述】:

我正在使用以下代码访问链接(用于 phpunit/selenium):

//td[normalize-space() ='Test title 2']/following-sibling::td[3]/a[.='delete']

在 FireFox 中使用 XPath 检查器会返回 7 个元素(因为有 7 个链接匹配“测试标题 2”),但是当我在末尾添加 [1] 时:

//td[normalize-space() ='Test title 2']/following-sibling::td[3]/a[.='delete'][1]

它仍然返回 7 个链接。我在这里做错了什么?

【问题讨论】:

  • 顺便说一句,selenium 默认只访问一个链接(七个链接中的第一个链接)。你想做什么?
  • 测试删除按钮是否有效——从之前的测试中生成的按钮

标签: xpath selenium


【解决方案1】:

当您在表达式末尾添加[1] 时,您选择每个...td[3] 的第一个a 子节点(即7 个a 子节点)。您可以将查询更改为:

xpath=(//td[normalize-space() ='Test title 2']/following-sibling::td[3]/a[.='delete'])[1]

或者如果您使用 webdriver(不需要 xpath 前缀):

(//td[normalize-space() ='Test title 2']/following-sibling::td[3]/a[.='delete'])[1]

这将从...td[3] 元素的整个a 子元素集中选择第一个a

更多教程请参考XPath Examples

【讨论】:

    【解决方案2】:

    正如the spec 所说:

    位置路径//para[1]与位置不一样 路径/descendant::para[1]。后者选择第一个后代 para 元素;前者选择所有后代para 元素 他们父母的第一个 para 孩子。

    因此,

    //td[normalize-space() ='Test title 2']/following-sibling::td[3]/descendant::a[.='delete'][1]
    

    会在你的情况下做得更好。

    【讨论】:

    • 请注意,规范中提到了 //para[1] 而不是 /para[1]
    • 所以/descendant::td[normalize-space()='Test title 2'][1]/following-sibling::td[3]/a[.='delete'] 会更正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2012-05-02
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多