为什么我的XPath不能根据标签文本选择链接/按钮?

5
<a href="javascript:void(0)" title="home">
    <span class="menu_icon">Maybe more text here</span>
    Home
</a>

对于上面的代码,当我写XPath为//a时,它被突出显示,但是当我写//a[contains(text(), 'Home')]时,它没有被突出显示。我认为这很简单,应该行得通。

我的错误在哪里?


你只能匹配文本吗?这样会非常不稳定。 - Arran
之前的xpath一直很好用,我不知道为什么现在不行了。虽然开发人员提到父标签的html有些更改,但是这部分代码似乎没有变化,所以我认为代码本来可以工作的。由于类似的代码已经写在其他地方,我想避免再次更改相似元素的xpath。 - Shoaib Akhtar
3个回答

6

其他回答都忽略了实际的问题:

  1. 是的,你可以匹配@title,但这并不是OP的XPath失败的原因。
  2. 是的,XML和XPath区分大小写,因此Homehome不同,但是a的子节点中存在一个文本节点Home,所以如果OP不信任@title的存在,则使用Home是正确的。

真正的问题

OP的XPath:

//a[contains(text(), 'Home')]

要选择所有首个文本节点包含子串Homea元素。但是,第一个文本节点仅包含空格。

解释:text()选择上下文节点a的所有子文本节点。当contains()将多个节点作为其第一个参数时,它会取第一个节点的字符串值,但是Home出现在第二个文本节点中而不是第一个。

因此,OP应该使用以下XPath:

//a[text()[contains(., 'Home')]]

这段文字要求选择所有包含子字符串 Home任意 文本的 a 元素。

如果没有周围的空格,此 XPath 可用于测试相等性而不是子字符串包含性:

//a[text()[.='Home']]

或者,带有周围空格的情况下,可以使用以下XPath来将其修剪掉:

//a[text()[normalize-space()= 'Home']]

另请参阅:


1
您可以尝试使用XPath。它只是通过属性选择元素。
 //a[@title,'home']

我知道在这种情况下它会起作用,但是我之前编写的XPath(如上所述)也很好用,我不知道为什么现在它不起作用了。虽然开发人员提到过父标签的HTML有所更改,但我仍认为代码本来可以运行。 - Shoaib Akhtar
我不确定,但是你的文本中用引号“Home”括起来的部分可能是原因。 - Zakaria Shahed
尝试使用双引号但不起作用 //a[contains(text(),'"Home"')] 或 //a[contains(text(),""Home"")] 或 //a[contains(text(),"""Home""")] 不起作用 - Shoaib Akhtar
假设我有文本“WE'd like to hear from you”那么XPath将类似于//input[contains(@text,"WE'd"]希望这样可以解决你的问题。 - Zakaria Shahed
有帮助(+1),但是还有一些更微妙的东西导致了OP的问题 - kjhughes

1

是的,你犯了两个错误,你写成了大写字母H的Home,但你想匹配小写字母h的home。另外,你试图检查文本内容,但你想要检查" title "属性。纠正这两点,你就可以得到:

//a[contains(@title, 'home')]

然而,如果您想匹配确切的字符串home,而不是任何一个具有在标题属性中任何位置都有home的a,则使用@zsbappa的代码。

有帮助(+1),但【还有一些更微妙的东西引起了问题】。 - kjhughes

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