Selenium XPath - 如何选择包含特定内容的表格的最后一行?

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

现在需要考虑存在错误的行,但仍需查看具有零错误的“最后”行 - 对于一个区域而言。
对于这种情况,可以使用以下方法:

如果一行中存在错误,则将该行视为当前区域的最后一行。只有当出现值为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个学校行,所以我需要表达式足够动态以处理这种情况。
2个回答

6

您正在搜索一个包含文本“school”的元素,但标记具有文本“School”,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]

奇怪,你所拥有的应该可以工作。你使用的是哪个版本的Selenium和哪个API? - Ardesco
@Ardesco基本上是正确的。 针对重新编辑的示例,请尝试使用以下内容:(//tr [td [.='school')]])[last()]/following::tr/td [2] - Ross Patterson

2

使用你的最终XPath,对我来说是有效的,并选择了最后一个“学校”。因此,我会询问您正在使用什么版本的所有内容,使用什么浏览器等等。

另外,有时在使用XPath时,位置索引可能会有些棘手,那么怎么样呢...

(//td[contains(text(),'School')])[last()]/following::td[2]

1
我很好奇问题是否出在IDE上。你能在Firebug中运行这个XPath吗? - Arran
1
寻找另一个名为Firepath的插件。它与Firebug集成,非常有用。 - Ardesco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接