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')]