not(@attribute)用于选取不包含指定属性的节点,语法必须为路径+[not(@属性名)],仅判断属性存在性而非值是否为空。

在XPath中,用 not(@attribute) 可以精准选取**不包含指定属性**的节点。它的核心逻辑是:对每个候选节点,检查它是否“没有这个属性”,返回 true 的节点才会被选中。
基本语法与写法
最常用的形式是:
- //*[@id and not(@class)] —— 选取有 id 属性但没有 class 属性的任意元素
- //div[not(@data-testid)] —— 选取所有不含 data-testid 属性的 div 元素
- //input[@type='text' and not(@disabled)] —— 选取 type 为 text 且未禁用(即无 disabled 属性)的 input
注意 not() 是谓词,必须放在方括号里
不能写成 //* not(@hidden) 或 //*[not @hidden] —— 这两种都语法错误。正确结构是:节点路径 + [not(@属性名)]。not() 是一个函数,只能出现在谓词(即中括号内),作用于当前上下文节点。
区分“无该属性”和“属性值为空”
not(@attr) 只判断属性是否存在,和属性值无关:
-
<div></div>→ 匹配(无 @class) -
<div class=""></div>→ 不匹配(有 @class,哪怕值为空字符串) -
<div class=" "></div>→ 不匹配(依然存在 class 属性)
如果想选“属性不存在或值为空”,需额外判断:[not(@class) or @class = '']。
常见组合与避坑提示
- 多个条件共存时,用 and 连接://button[@type='submit' and not(@disabled)]
- 避免写成 //*[not(@*)] —— 这会匹配所有“完全没有任何属性”的节点(包括 html、body 等),通常范围过大
- 在 Selenium 或浏览器控制台中测试时,可先用 //*[not(@data-cy)] 尝试,再逐步加限定(如 //div[not(@data-cy)])提高准确性


















