Xpath: выберите div, содержащий класс AND, чей особый дочерний элемент содержит текст
С помощью this SO question у меня есть почти рабочий xpath:
//div[contains(@class, 'measure-tab') and contains(., 'someText')]
Однако это получает два divs
: в одном это дочерний td
, который имеет некоторыйText, другой - дочерний span
.
Как я могу сузить его до span
?
<div class="measure-tab">
<!-- table html omitted -->
<td> someText</td>
</div>
<div class="measure-tab"> <-- I want to select this div (and use contains @class)
<div>
<span> someText</span> <-- that contains a deeply nested span with this text
</div>
</div>
Ответы
Ответ 1
Чтобы найти div
определенного класса, который содержит span
на любой глубине, содержащий определенный текст, попробуйте:
//div[contains(@class, 'measure-tab') and contains(.//span, 'someText')]
Тем не менее, это решение выглядит очень хрупким. Если таблица содержит span
с текстом, который вы ищете, также будет сопоставлен div
, содержащий таблицу. Я бы предложил найти более надежный способ фильтрации элементов. Например, используя идентификаторы или структуру документа верхнего уровня.
Ответ 2
Вы можете изменить свое второе условие, чтобы проверить только элемент span:
...and contains(div/span, 'someText')]
Если диапазон не всегда находится внутри другого div, вы также можете использовать
...and contains(.//span, 'someText')]
Это ищет диапазон в любом месте div.
Ответ 3
Вы можете использовать xpath:
//div[@class="measure-tab" and .//span[contains(., "someText")]]
Вход:
<root>
<div class="measure-tab">
<td> someText</td>
</div>
<div class="measure-tab">
<div>
<div2>
<span>someText2</span>
</div2>
</div>
</div>
</root>
Выход:
Element='<div class="measure-tab">
<div>
<div2>
<span>someText2</span>
</div2>
</div>
</div>'
Ответ 4
Вы можете использовать ancestor
. Я считаю, что это легче читать, потому что элемент, который вы фактически выбираете, находится в конце пути.
//span[contains(text(),'someText')]/ancestor::div[contains(@class, 'measure-tab')]