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

14
Selenium WebDriver 中,如何使用 XPath 表达式来定位下面 HTML 中的链接文本 ("Add New Button")?
<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根据链接文本找到链接呢?


1
尝试使用//a[contains(., 'Add New Button')]。 - acikojevic
2
  1. 缺少一个闭括号,不是吗?
- geisterfurz007
4个回答

26

一些已经给出的答案有效,但其他答案则无效。我认为原帖作者会从更多的解释中受益。

您最初的表达方式:

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

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

接下来的一个:

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

忽略括号缺失,以下代码不起作用,因为text()返回一个节点序列,像contains()这样的函数只会评估序列中的第一个节点。在此情况下,a标签内的第一个文本节点仅包含空格,而不是包含“Add New Button”的那个节点。

你可以通过以下方法验证此说法:

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

这将测试 a 元素的第二个文本节点是否包含“Add New Button” —— 该表达式将返回 a 元素。但在这种情况下,最好的解决方案是:

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

.将评估元素的所谓“字符串值”,这是所有文本节点的串联,其中将包括“Add New Button”。


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

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

在第二种方法中,您错过了contains的一个括号。 - Nouman
@BlackThunder 你说得对,已经编辑好了 - 感谢你指出。 - Mathias Müller

2
使用XPath表达式,您可以使用以下语句检查元素是否包含某个文本:
//a[contains(., 'Button')]

2

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

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

2
这个答案返回了正确的结果,但是原因错误。text()="Add New Button"的求值结果为“false”,因为没有这样的文本节点。normalize-space()将布尔值解释为字符串(与string(//a/text() ="Add New Button")的结果相同),整个谓词简化为://a[true]。您可以通过从HTML中删除“Add New Button”来测试此功能,a元素仍将被返回。 - Mathias Müller

0
请使用以下XPath表达式:
//*[contains(text(),'Add New Button')]

或者

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

或者

//a[@href='SOME URL']/i

或者使用 cssSelector -

a[href='SOME URL']>i

2
你的前两个建议是错误的(它们没有返回任何结果),另外两个则忽略了“添加新按钮”应该用于识别元素这一事实。 - Mathias Müller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接