<a href="javascript:void(0)" title="home">
<span class="menu_icon">Maybe more text here</span>
Home
</a>
对于上面的代码,当我写XPath为//a
时,它被突出显示,但是当我写//a[contains(text(), 'Home')]
时,它没有被突出显示。我认为这很简单,应该行得通。
我的错误在哪里?
<a href="javascript:void(0)" title="home">
<span class="menu_icon">Maybe more text here</span>
Home
</a>
对于上面的代码,当我写XPath为//a
时,它被突出显示,但是当我写//a[contains(text(), 'Home')]
时,它没有被突出显示。我认为这很简单,应该行得通。
我的错误在哪里?
其他回答都忽略了实际的问题:
@title
,但这并不是OP的XPath失败的原因。Home
与home
不同,但是a
的子节点中存在一个文本节点Home
,所以如果OP不信任@title
的存在,则使用Home
是正确的。OP的XPath:
//a[contains(text(), 'Home')]
要选择所有首个文本节点包含子串Home
的a
元素。但是,第一个文本节点仅包含空格。
解释:text()
选择上下文节点a
的所有子文本节点。当contains()
将多个节点作为其第一个参数时,它会取第一个节点的字符串值,但是Home
出现在第二个文本节点中而不是第一个。
因此,OP应该使用以下XPath:
//a[text()[contains(., 'Home')]]
这段文字要求选择所有包含子字符串 Home
的 任意 文本的 a
元素。
如果没有周围的空格,此 XPath 可用于测试相等性而不是子字符串包含性:
//a[text()[.='Home']]
或者,带有周围空格的情况下,可以使用以下XPath来将其修剪掉:
//a[text()[normalize-space()= 'Home']]
//a[@title,'home']
是的,你犯了两个错误,你写成了大写字母H的Home
,但你想匹配小写字母h的home
。另外,你试图检查文本内容,但你想要检查" title "属性。纠正这两点,你就可以得到:
//a[contains(@title, 'home')]
home
,而不是任何一个具有在标题属性中任何位置都有home
的a,则使用@zsbappa的代码。