Xpaht self::div 轴语法

self::div 是 XPath 里的 轴语法,意思是:

复制代码
当前节点自己是不是 div 标签

比如这个 XPath:

复制代码
//*[self::div and contains(@class, 'title')]

可以拆开理解:

复制代码
//* 

先找页面上所有元素。

复制代码
[self::div and contains(@class, 'title')]

然后筛选:当前这个元素本身必须是 div,并且 class 包含 title。

所以它基本等价于:

复制代码
//div[contains(@class, 'title')]

你看到的这段:

复制代码
//*[self::div and (contains(@class, 'title') or contains(@class, 'desc_block'))]

意思是:

复制代码
找所有元素里,当前元素本身是 div,并且 class 包含 title 或 desc_block 的元素

等价于更普通的写法:

复制代码
//div[contains(@class, 'title') or contains(@class, 'desc_block')]

那为什么有时候用 self::div?

主要是为了方便兼容多个标签类型。比如你不确定弹框文案是在 div、span、p 哪个标签里,可以写:

复制代码
//*[self::div or self::span or self::p]

意思是:

复制代码
当前元素可以是 div,也可以是 span,也可以是 p

例如:

复制代码
//*[self::div or self::span or self::p]
[contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'your verification')]
[contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'under review')]

如果你这里只想匹配 div,可以不用 self::div,直接写:

复制代码
String xpath =
        "//div[(contains(@class, 'title') or contains(@class, 'desc_block')) "
                + "and contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'your verification') "
                + "and contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'under review')]";

这个更直观。


如果你想更通用,兼容 div/span/p,就用 self:::

复制代码
String xpath =
        "//*[(self::div or self::span or self::p) "
                + "and (contains(@class, 'title') or contains(@class, 'desc_block')) "
                + "and contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'your verification') "
                + "and contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'under review')]";

简单记:

复制代码
self::div

就是:

复制代码
当前节点自己是 div

self::span

就是:

复制代码
当前节点自己是 span

self::div or self::span

就是:

复制代码
当前节点可以是 div 或 span

你这个场景,如果 DOM 里确定就是 div,直接用 //div[...] 就行;如果前端标签可能变,用 //*[self::div or self::span or self::p ...] 更稳。

相关推荐
Nebula_g15 分钟前
JavaSE加强:Stream流
java·开发语言·windows·stream·javase·流
估值探索者16 分钟前
【Python量化系统工程实战 #08】从脚本到生产:量化系统上线 checklist 的最小闭环
java·开发语言·jvm·python·数据挖掘·数据·股票数据api接口
Wang's Blog20 分钟前
Java框架 SpringCloud 快速入门: Nacos 环境隔离
java·开发语言·spring cloud
破芽1 小时前
python知识点整理02
开发语言·python
denlaku1 小时前
JDK 10 新特性详解
java·开发语言
cfm_29141 小时前
Java常见加密算法全解
开发语言
墨染天姬1 小时前
【人工智能训练师】python语法二
开发语言·人工智能·python
木易 士心1 小时前
JavaScript 闭包原理和实践深度解析
开发语言·javascript·ecmascript
小羊没烦恼!1 小时前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#
Chase_______1 小时前
【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署
java·开发语言·jvm