我在调试别人的Selenium代码。他们有一个类似于td['6']的xpath。这是失败的。我使用直觉,并将其改为td[6],后者修复了它。然而,td['6']并没有像我想的那样给出错误。它定位了一个元素,但与没有引号的元素完全不同。
这让我开始思考,把这个数字放在引号里是什么意思,比如td['6']?
发布于 2019-02-19 20:54:29
td[predicate]的意思是:
返回谓词为
true的第一个true节点。
每个非空字符串返回true,因此td['6']将选择DOM中的第一个td节点。
td[6]是td[position()=6]表达式的缩写,意思是:
返回
td,这是td类型的第六个子类型。“
发布于 2019-02-19 20:16:13
XPath 1.0规范指出,“TD”是轴(例如,子)和节点-测试(标记名TD),方括号内的所有内容都是谓词表达式,它要么被计算为布尔(真或假),要么在特殊情况下被计算为节点集的位置筛选器:
如果结果不是数字,则结果将被转换为调用布尔函数。因此,位置路径para3等效于paraposition()=3。
举例说明
下面三个XPath谓词案例通过对来自这个样本表(w3schools)的输入的计算来解释
+-------------------------------+-------------------+---------+
| Company | Contact | Country |
+-------------------------------+-------------------+---------+
| Alfreds Futterkiste | Maria Anders | Germany |
| Centro comercial Moctezuma | Francisco Chang | Mexico |
| Ernst Handel | Roland Mendel | Austria |
| Island Trading | Helen Bennett | UK |
| Laughing Bacchus Winecellars | Yoshi Tannamuri | Canada |
| Magazzini Alimentari Riuniti | Giovanni Rovelli | Italy |
+-------------------------------+-------------------+---------+案例1:数字作为谓词
td[6]选择第6个子表数据元素,因为6是谓词position()=6的缩写。
示例:选择第三列的每个单元格
XPath://td[3]
输出:
<td>Germany</td>
<td>Mexico</td>
<td>Austria</td>
<td>UK</td>
<td>Canada</td>
<td>Italy</td> 试试在线演示
案例2:引用字符串作为谓词
td['6']选择每个子表数据元素,因为字符串'6'不是空的或具有非零长度,因此计算值为true (参见布尔变换)。因此,TD-元素的节点集不再被进一步过滤(因为谓词始终为真)。
示例:选择每个单元格(因为字符串谓词始终为真)
XPath://td['3']
输出:
<td>Alfreds Futterkiste</td>
<td>Maria Anders</td>
<td>Germany</td>
<td>Centro comercial Moctezuma</td>
<td>Francisco Chang</td>
<td>Mexico</td>
<td>Ernst Handel</td>
<td>Roland Mendel</td>
<td>Austria</td>
<td>Island Trading</td>
<td>Helen Bennett</td>
<td>UK</td>
<td>Laughing Bacchus Winecellars</td>
<td>Yoshi Tannamuri</td>
<td>Canada</td>
<td>Magazzini Alimentari Riuniti</td>
<td>Giovanni Rovelli</td>
<td>Italy</td> 试试在线演示
案例3:条件谓词测试元素
这是谓词表达式的真正好处,并允许您对元素进行测试,例如,查找具有colspan属性的所有合并表单元格:
td[@colspan]参见这个复杂的用例:带有多个谓词的Xpath表达式
示例:选择内容以“A”开头的所有单元格
XPath://tr/td[starts-with(., 'A')]
输出:
<td>Alfreds Futterkiste</td>
<td>Austria</td> 试试在线演示
https://stackoverflow.com/questions/54773317
复制相似问题