首页 > 解决方案 > xpath中的点(。)如何在识别元素和匹配文本时采用多种形式

问题描述

我有以下dom结构:

<h3 class="popover-title">
 <div class="popup-title">
   <div class="title-txt">Associated Elements&nbsp;&nbsp(5)</div>
 </div>
</h3>

我正在尝试编写一个 xpath,它将在 h3 标签下识别标题“关联元素”。

当我的 xpath 是

//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]

元素被识别。

但是,当我的 xpath 是

//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]

未识别该元素。根据我的理解,dot(.) 是 text() 的替代品,但是当我使用 text() 函数时,为什么它不能识别元素。

但是,对于另一个 dom 结构:

<h3 class="popover-title">
   <a class="btn-popover" href="#">x</a>
   "Associated Elements"
</h3>

xpath:

//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]

&

//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]

工作正常。

有人可以解释一下 dot(.) 在这两种情况下的行为吗?

有没有更好的方法来编写对这两个例子都适用的 xpath?请建议。

标签: seleniumselenium-webdriverxpathwebdriverxpath-1.0

解决方案


由于标记了,因此此答案将基于和相关的XML 路径语言 (XPath) 版本 1.0规范。


包含(字符串,字符串)

boolean contains(string, string)如果第一个参数字符串包含第二个参数字符串,则该函数返回 true,否则返回 false。举个例子:

//h3[contains(.,'Associated Elements')]

文本节点

字符数据被分组到文本节点中。尽可能多的字符数据被分组到每个文本节点中。文本节点的字符串值是字符数据。一个文本节点总是至少有一个字符的数据。在下面的示例中,text()选择上下文节点的所有文本节点子节点:

//h3[text()='Associated Elements']

在您的用例中,在 HTML 中,文本Associated Elements  (5)&nbsp;被称为固定空间硬空间NBSP(非破坏空间)在编程中用于在一行中创建一个不能被破坏的空间通过自动换行。在 HTML 中,&nbsp;允许您创建在网页上可见的多个空间,而不仅仅是在源代码中。


分析您的代码试验

您的第一次代码试用:

//h3[contains(.,'Associated Elements')]

使用部分文本成功识别元素

您的第二次代码试用:

//h3[contains(text(),'Associated Elements')]

失败,因为元素包含更多字符,例如&nbsp;除了文本Associated Elements之外。


参考

您可以在以下位置找到一些相关的讨论:


推荐阅读