2013-04-12 4 views
4

У меня есть таблица вроде этого: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> 

Как я могу выбрать последнюю строку для области 'Школ.

До недавнего времени я использовал 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 школьных рядов, поэтому мне нужно, чтобы выражение было достаточно динамичным, чтобы справиться с этим.

ответ

5

Вы ищете элемент, который содержит текст «школа», но разметка имеет текст «Школа», XPath чувствителен к регистру.

Вы можете обойти эту проблему путем перевода прописных букв в строчные буквы, это сделает ваш XPath следующим образом:

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

* Примечание *

Я не использовал XPath2 ниже -case(), потому что он не будет работать во всех браузерах.

* Редактировать *

Обновления для новой наценки XPATH, который чувствителен к регистру будет:

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

или более упрощенной версии, которая не чувствительна к регистру будет:

//tr[td[contains(., 'school')]][last()]/td[2] 

(. Является сокращением текста(), вы можете обменять их, если хотите)

вы могли бы, вероятно, также уйти с

//tr[td[.='school']][last()]/td[2] 
+0

Странно, что вы должны работать тогда. Какую версию селена вы используете, и какой API? – Ardesco

+0

@ Ардеско в принципе прав. В свете повторного отредактированного примера попробуйте следующее: '(// tr [td [. = 'School']]]) [last()]/follow :: tr/td [2]'. –

+0

Или еще один Росс тоже будет работать :) – Ardesco

2

Используя ваш последний XPath, он работает для меня и выбирает последние «Школы». Так что я бы пойти и спросить, какие версии все, что вы используете, какие браузеры и т.д.

Кроме того, иногда при использовании XPath может быть немного суетливый с позиционными индексаторами, так что о ...

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

Мне было бы любопытно, лежит ли проблема с IDE или нет. Можете ли вы запустить этот XPath в Firebug? – Arran

+1

Ищите другой аддон под названием firepath. Он интегрируется с firebug и очень полезен. – Ardesco

Смежные вопросы