提问人:Chethan Swaroop 提问时间:9/26/2019 最后编辑:undetected SeleniumChethan Swaroop 更新时间:1/20/2020 访问量:659
xpath 中的 dot(.) 如何以多种形式识别元素和匹配文本
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 标签下标识标题“相关元素”。
当我的 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?请提出建议。
答:
in 是一个选择器,它与作为上下文节点子节点的所有文本节点匹配 - 它返回一个节点集。该节点集将转换为字符串并传递给函数。text()
contains(text(),'Associated Elements')
contains()
text()
不是一个函数,而是一个节点测试。它用于选择上下文节点的所有文本节点子节点。因此,如果上下文节点是名为 x 的元素,则 text() 会选择 x 的所有 text-node 子节点。
使用时,仅将单个文本节点传递给函数,并且它能够唯一匹配文本。contains(., 'Associated Elements')
注意:从这篇文章和这篇文章中复制和编辑。
由于 selenium 被标记,因此此答案将基于 xpath-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(不间断空格)在编程中用于在行中创建一个无法通过换行换行中断开的空格。在 HTML 中,
允许您创建多个空格,这些空格在网页上可见,而不仅仅是在源代码中可见。
分析代码试用版
您的第一次代码试用:
//h3[contains(.,'Associated Elements')]
在元素成功识别部分文本关联元素时定位元素
您的第二次代码试用版:
//h3[contains(text(),'Associated Elements')]
失败,因为元素包含更多字符,例如 除了文本 Associated Elements。
参考
您可以在以下位置找到一些相关讨论:
- 如何通过 Python 使用 Selenium 找到按钮元素
- 在 Selenium 中使用的 xpath 中,contains(., 'some text') 指的是什么
- 在获取所有链接的同时,忽略循环中的注销链接并继续在selenium java中导航
评论
fails the element contains some more characters in addition to the text Associated Elements
你不是说吗?fails the element contains some more elements in addition to the text Associated Elements
评论
xpath
//div
//h3