2015-01-16 3 views
1

У меня есть HTML похож на это:Как я могу написать лучшее выражение xpath?

<tr> 
    <td> 
    <span> 
     <span class = "x28w"></span> 
    </span> 
    <td> 
    <span> 
     <a> 
     <span>3899393</span> 
     </a> 
    </span> 
    </td> 
</tr> 

<tr> 
    <td> 
    <span> 
    </span> 
    <td> 
    <span> 
     <a> 
     <span>3899394</span> 
     </a> 
    </span> 
    </td> 
</tr> 

Поэтому в основном первый пролет пустым, но будет отображаться значок, если имеется подзаголовок пролет под ним с классом "x28w". Второй (то есть 3899393) является номером корпуса.

Я хочу написать метод selenium в Java List<String>getCasesWithAlert().

Я могу сделать findElements(By.xpath("//tr")), прокрутить элементы, проверить, есть ли td/span/span[contains(@class,'x28w')] для текущего tr.

Если есть, то возьмите строку, найдите дочерние элементы td, получите вторую и найдите элемент a/span, а затем получите текст. Но это немного сложно.

Есть ли какое-то выражение xpath, которое я могу использовать (например, следующий-брат или что-то еще), чтобы найти случаи, содержащие значки предупреждений (класс x28w) в одном выражении?

ответ

0

Для каждого tr вы можете проверить, если первый td соответствует критериям и получить желаемый span элемент из второго td:

//tr[td[1][span/span[contains(@class,'x28w')]]]/td[2]/span/a/span 
+0

Спасибо. Это фактически внутри более html, поэтому вместо tr это // div [содержит (@ id, 't1 :: db') или содержит (@ id, 't2 :: db')]/table [1]/tbody [1]/tr ", но я предполагаю, что могу просто экстраполировать ваш путь, правильно? – user3257891

+0

@ user3257891 yup, идея остается прежней, я использовал HTML, который вы предоставили для тестирования, - работал для меня. ваш реальный код HTML, если у вас возникнут трудности с применением решения. Спасибо. – alecxe

+0

Как получить обратное? Те, у кого нет x28w? Тогда нет второго x28w. Я не могу использовать span [not содержит ... потому что не будет внутреннего промежутка. – user3257891

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