selenium xpath - 如何选择具有特定内容的表的最后一行?

Mic*_*ant 5 selenium xpath

我有这样一张桌子:

<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个学校行,所以我需要表达式足够动态来处理它.

Ard*_*sco 6

您正在搜索包含文本"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)