使用链接文本查找链接的 XPath 表达式

新手上路,请多包涵

Selenium WebDriver 中,如何使用 _链接文本_(“添加新按钮”)为以下 HTML 使用 XPath 表达式?

 <a href="SOME URL">
  <span >
    <i class=""/>
  </span>Add New Button
</a>

我尝试如下检查元素,但都没有用。

  1. //a[text()='Add New Button']
  2. //a[contains(text(),'Add New Button']
  3. //a/span/i[text()='Add New Button']
  4. //a/span/i[contains(text(),'Add New Button']

我知道 3 和 4 不会,但我只是试过了。

那么对于这样一个 HTML DOM,我如何使用 XPath 找到使用链接文本的链接呢?

原文由 user2416212 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 408
2 个回答

一些已经给出的答案有效,但其他答案则没有。而且我认为 OP 会从更多解释中受益。

你原来的表达:

 //a[text()='Add New Button']

不起作用,因为包含“添加新按钮”的文本节点末尾也有一个换行符。

下一个:

 //a[contains(text(),'Add New Button']

不起作用(撇开缺少的括号),因为 text() 返回一个节点 _序列_,而类似 contains() 的函数将仅评估序列中的 第一个 节点。在这种情况下,内部的第一个文本节点 a 仅包含空格,而 不是 包含“添加新按钮”的节点。

您可以通过以下方式验证此声明:

 //a[contains(text()[2],'Add New Button')]

这将测试 a第二个 文本节点是否包含“添加新按钮”——并且该表达式将返回 a 元素。但在这种情况下最好的解决方案是:

 //a[contains(.,'Add New Button')]

. 将评估元素的所谓“字符串值”,即所有文本节点的串联,其中将包括“添加新按钮”。


normalize-space() 的解决方案也是可能的,但它有嵌套谓词:

 //a[text()[normalize-space(.) = "Add New Button"]]

原文由 Mathias Müller 发布,翻译遵循 CC BY-SA 4.0 许可协议

链接文本包含正文右侧不必要的空格,因此您需要执行以下操作来删除它们:

 '//a[normalize-space(.)="Add New Button"]'

原文由 Andersson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题