Каков правильный XPath для идентификации элемента с текстом, встречающимся Минимальное количество раз?

#html #selenium #selenium-webdriver #xpath #webdriver

Вопрос:

Я пытаюсь идентифицировать элемент, содержащий определенный текст, но я хочу идентифицировать элемент только в том случае, если нужный текст встречается определенное количество раз.

Например, представьте, что у нас есть два следующих фрагмента HTML на одной странице:

Фрагмент 1:

 <span id="price">

$36.46

<span>
($0.38 /  Count)
</span>
  
</span>
 

Фрагмент 2:

 <span id="price">$38.38</span>
 

Я мог бы идентифицировать оба элемента с помощью XPath: .//span[contains(text(),'$')] Однако я хочу идентифицировать элемент только в том случае, если он (или любой потомок элемента span) содержит по крайней мере два экземпляра символа: $

В приведенном выше примере он будет идентифицировать только первый фрагмент, потому что второй фрагмент содержит только один экземпляр $, а не два.

Каков правильный синтаксис XPath для использования?

Ответ №1:

Вы можете использовать XPath //span[count(.//text()[contains(., "$")]) >= 2]

Это умеренно сложный XPath, поэтому, чтобы немного объяснить это, расширяясь наружу:

.//text()[contains(., "$")]

Выберите все текстовые элементы, исходящие из текущего узла, в котором сам содержит «$».

count(.//text()[contains(., "$")])

Подсчитайте количество текстовых элементов, исходящих из текущего узла, в котором сам содержит «$».

//span[count(.//text()[contains(., "$")]) >= 2]

Выберите все span элементы с двумя или более текстовыми потомками, чье «я»содержит»$».

С оговоркой, это работает только в том случае, если знак доллара находится в двух разных текстовых элементах. Если вы хотите включить span в этот пример:

 <span>
    $
    <span>
    foo
    </span>
</span>
 

…тогда вам понадобится другой подход:

//span[string-length(.) - string-length(translate(., "$", "")) >= 2]

Этот предикат сравнивает длину строки интервала с длиной строки того же интервала, при этом все символы «$» удалены.

Ответ №2:

Одним из доступных выражений XPath-1.0 является

 string-length(/span[@id='price'])-string-length(translate(/span[@id='price'],'

В предикате это может выглядеть так

 //span[string-length(.)-string-length(translate(.,'

Это выражение выбирает только элементы с числом  $  >= 2



,''))
В предикате это может выглядеть так


Это выражение выбирает только элементы с числом $ >= 2

,''))>=2]

Это выражение выбирает только элементы с числом $ >= 2

,»))

В предикате это может выглядеть так


Это выражение выбирает только элементы с числом $ >= 2