5

我有一张这样的桌子:

<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

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

4

2 回答 2

6

您正在搜索包含文本“学校”的元素,但标记包含文本“学校”,XPath 区分大小写。

您可以通过将大写字母转换为小写字母来解决此问题,这将使您的 XPath 如下所示:

//td[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'school')][last()]/following::td[2]

*笔记*

我没有使用 XPath2 lower-case() 函数,因为它不适用于所有浏览器。

*编辑*

为新标记更新了不区分大小写的 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]
于 2013-04-12T15:52:18.353 回答
2

使用您的最终 XPath,它适用于我,并且确实选择了最后一个“学校”。所以我会去问你正在使用什么版本,什么浏览器等

此外,有时在使用 XPath 时,位置索引器可能会有点麻烦,那么……

(//td[contains(text(),'School')])[last()]/following::td[2]
于 2013-04-12T15:04:51.010 回答