selenium - xpath中的点(。)如何在识别元素和匹配文本时采用多种形式
问题描述
我有以下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?请建议。
解决方案
由于标记了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之外。
参考
您可以在以下位置找到一些相关的讨论:
推荐阅读
- bonita - 启动后修改 Bonita 进程实例
- flutter - 在 Flutter 应用中集成 Paypal 支付
- c++ - DrawShadow 中的 Elevation 到底是做什么的?
- angular - 在 NativeScript Angular 中设置 SuggestionView 宽度的任何方式
- ubuntu - fail2ban apachefakegooglebot 失败正则表达式位置
- python - 我的 Discord XP 机器人无法识别 JSON 文件中的用户数据?
- java - @JsonFormat 不适用于自定义序列化程序
- javascript - 用于加载 HTML 文件的 JQuery 函数调用不起作用
- swiftui - 带有 SwiftUI 的 Apple Watch 上列表项的背景
- ruby-on-rails - 木材:找不到命令“木材”