我有这样一张桌子:
<table>
<th>
<td>Area</td><td># of errors</td>
</th>
<tr><td>school</td><td>23</td></tr>
<tr><td>student</td><td>0</td></tr>
<tr><td>school</td><td>17</td></tr>
<tr><td>student</td><td>0</td></tr>
</table>
Run Code Online (Sandbox Code Playgroud)
如何选择"学校"区域的最后一行.
直到最近我才使用assert_text
//table//tr//td[contains(text(),'school')]/following::td
Run Code Online (Sandbox Code Playgroud)
和value0,即零错误.
但是,现在我需要考虑有错误的行,但仍然会查看"最后"行 - 对于一个区域 - 没有错误.
对于这种情况,使用
//table//tr//td[contains(text(),'school')]/following::td
Run Code Online (Sandbox Code Playgroud)
错误地选择具有23个错误的第一行.
我试过用tr[last()]-
//table//tr[last()]//td[contains(text(),'school')]/following::td[2]
Run Code Online (Sandbox Code Playgroud)
但问题是这个选择最后一个表行 - 这是给学生的.我想要学校的最后一个表行(它实际上是所有行的最后一个表行).
我也尝试过:
//table//td[contains(text(),'school')][last()]/following::td[2]
Run Code Online (Sandbox Code Playgroud)
但这不起作用(它仍然选择'第一'学校行).
我需要能够只考虑一个学校行,两个学校行和超过2个学校行,所以我需要表达式足够动态来处理它.
您正在搜索包含文本"school"的元素,但标记的文本为"School",XPath区分大小写.
你可以通过将大写字母翻译成小写字母来解决这个问题,这会使你的XPath像这样:
//td[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'school')][last()]/following::td[2]
Run Code Online (Sandbox Code Playgroud)
*注意*
我没有使用XPath2小写()函数,因为它不适用于所有浏览器.
*编辑*
更新了新标记,不区分大小写的xpath将是:
//tr[td[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'school')]][last()]/td[2]
Run Code Online (Sandbox Code Playgroud)
或者不区分大小写的更简化的版本是:
//tr[td[contains(., 'school')]][last()]/td[2]
Run Code Online (Sandbox Code Playgroud)
(.是text()的简写,如果你愿意,可以互换它们)
你可能也可以逃脱
//tr[td[.='school']][last()]/td[2]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21534 次 |
| 最近记录: |