xpath中的点(。)如何在识别元素和匹配文本时采用多种形式
How does dot(.) in xpath to take multiple form in identifying an element and matching a text
我有以下 dom 结构:
<h3 class="popover-title">
<div class="popup-title">
<div class="title-txt">Associated Elements  (5)</div>
</div>
</h3>
我正在尝试编写一个 xpath 来识别 h3 标签下的标题 "Associated Elements"。
当我的 xpath 是
//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]
元素已识别。
但是当我的 xpath 是
//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]
元素未被识别。
根据我的理解,点 (.) 是 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')]
工作正常。
有人可以解释点 (.) 在这两种情况下的行为吗?
有没有更好的方法来编写对两个示例都适用的 xpath?请推荐。
contains(text(),'Associated Elements')
中的 text()
是一个 selector 匹配作为上下文节点子节点的所有文本节点 - 它 returns 一个节点集.该节点集被转换为字符串并传递给 contains()
函数。
text()
不是函数而是节点测试。它用于 select 上下文节点的所有文本节点子节点。因此,如果上下文节点是名为 x 的元素,则 text() select 是 x 的所有文本节点子节点。
当您使用 contains(., 'Associated Elements')
时,只有一个单独的文本节点被传递给函数并且它能够唯一匹配文本。
注意: 从 this and this post 复制和编辑。
作为 selenium is tagged so this answer would be based on xpath-1.0 and the associated XML Path Language (XPath) Version 1.0 规范。
包含(字符串,字符串)
如果第一个参数字符串包含第二个参数字符串,函数 boolean contains(string, string)
returns 为真,否则 returns 为假。例如:
//h3[contains(.,'Associated Elements')]
文本节点
字符数据分组到text nodes。尽可能多的字符数据被分组到每个文本节点中。文本节点的string-value是字符数据。一个文本节点总是至少有一个数据字符。在下面的示例中,text()
选择上下文节点的所有文本节点子节点:
//h3[text()='Associated Elements']
在您的用例中,在 HTML 文本 Associated Elements  (5) 中有
这也被称为 fixed space 或 hard space, NBSP(非breaking space) 用于在编程中创建一个不能被自动换行打断的行中的 space。在 HTML、
中,您可以创建多个 space,它们不仅在源代码中而且在网页上可见。
正在分析您的代码试验
您的第一次代码试用:
//h3[contains(.,'Associated Elements')]
定位元素,因为它成功识别了部分文本关联元素
您的第二次代码试用:
//h3[contains(text(),'Associated Elements')]
失败 因为该元素包含更多字符,例如
除了文本 Associated Elements.
参考
您可以在以下位置找到一些相关讨论:
我有以下 dom 结构:
<h3 class="popover-title">
<div class="popup-title">
<div class="title-txt">Associated Elements  (5)</div>
</div>
</h3>
我正在尝试编写一个 xpath 来识别 h3 标签下的标题 "Associated Elements"。
当我的 xpath 是
//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]
元素已识别。
但是当我的 xpath 是
//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]
元素未被识别。 根据我的理解,点 (.) 是 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')]
工作正常。
有人可以解释点 (.) 在这两种情况下的行为吗?
有没有更好的方法来编写对两个示例都适用的 xpath?请推荐。
contains(text(),'Associated Elements')
中的 text()
是一个 selector 匹配作为上下文节点子节点的所有文本节点 - 它 returns 一个节点集.该节点集被转换为字符串并传递给 contains()
函数。
text()
不是函数而是节点测试。它用于 select 上下文节点的所有文本节点子节点。因此,如果上下文节点是名为 x 的元素,则 text() select 是 x 的所有文本节点子节点。
当您使用 contains(., 'Associated Elements')
时,只有一个单独的文本节点被传递给函数并且它能够唯一匹配文本。
注意: 从 this and this post 复制和编辑。
作为 selenium is tagged so this answer would be based on xpath-1.0 and the associated XML Path Language (XPath) Version 1.0 规范。
包含(字符串,字符串)
如果第一个参数字符串包含第二个参数字符串,函数 boolean contains(string, string)
returns 为真,否则 returns 为假。例如:
//h3[contains(.,'Associated Elements')]
文本节点
字符数据分组到text nodes。尽可能多的字符数据被分组到每个文本节点中。文本节点的string-value是字符数据。一个文本节点总是至少有一个数据字符。在下面的示例中,text()
选择上下文节点的所有文本节点子节点:
//h3[text()='Associated Elements']
在您的用例中,在 HTML 文本 Associated Elements  (5) 中有
这也被称为 fixed space 或 hard space, NBSP(非breaking space) 用于在编程中创建一个不能被自动换行打断的行中的 space。在 HTML、
中,您可以创建多个 space,它们不仅在源代码中而且在网页上可见。
正在分析您的代码试验
您的第一次代码试用:
//h3[contains(.,'Associated Elements')]
定位元素,因为它成功识别了部分文本关联元素
您的第二次代码试用:
//h3[contains(text(),'Associated Elements')]
失败 因为该元素包含更多字符,例如
除了文本 Associated Elements.
参考
您可以在以下位置找到一些相关讨论: