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

时间:2013-04-12 14:51:09

标签: xpath selenium

我有一张这样的表:

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

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]