我有一张这样的表:
<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>
如何选择“学校”区域的最后一行。
直到最近我使用了assert_text和
//table//tr//td[contains(text(),'school')]/following::td
和value
为0,即零错误。
但是,现在我需要考虑有错误的行,但仍然会查看“最后”行 - 对于一个区域 - 没有错误。
在这种情况下,使用
//table//tr//td[contains(text(),'school')]/following::td
错误地选择了包含23个错误的第一行。
我尝试使用tr[last()]
-
//table//tr[last()]//td[contains(text(),'school')]/following::td[2]
但问题是这会选择最后一个表行 - 这是给学生的。我想要学校的最后一个表行(它实际上是所有行的最后一个表行)。
我也尝试过:
//table//td[contains(text(),'school')][last()]/following::td[2]
但这不起作用(它仍然选择'第一'学校行。)
我需要能够只考虑一个学校行,两个学校行和超过2个学校行,所以我需要表达式足够动态来处理它。
答案 0 :(得分:5)
您正在搜索包含文本“school”的元素,但标记的文本为“School”,XPath区分大小写。
你可以通过将大写字母翻译成小写字母来解决这个问题,这会使你的XPath像这样:
//td[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'school')][last()]/following::td[2]
<强> *注* 强>
我没有使用XPath2小写()函数,因为它不适用于所有浏览器。
<强> *编辑* 强>
为新标记更新了不区分大小写的xpath:
//tr[td[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'school')]][last()]/td[2]
或者不区分大小写的更简化版本是:
//tr[td[contains(., 'school')]][last()]/td[2]
(。是text()的简写,如果你愿意,可以互换它们)
你可能也可以逃脱
//tr[td[.='school']][last()]/td[2]
答案 1 :(得分:2)
使用你的最终XPath,它适用于我,并选择最后的'学校'。所以我会去询问您使用的所有版本的版本,浏览器等等
另外,有时使用XPath时,对于位置索引器来说可能有些挑剔,那么......
(//td[contains(text(),'School')])[last()]/following::td[2]