#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