#python #html #xml #selenium #xpath
#python #HTML #xml #selenium #xpath
Вопрос:
Я пытаюсь найти приведенный ниже элемент, используя Selenium:
<a class="ABC" href="#" data-test-id="XXX|YYY|ZZZ">
На странице есть несколько элементов с «ABC», «XXX», «YYY» и «ZZZ», но мои ключевые слова — «ABC» и «ZZZ». Итак, чтобы точно настроить таргетинг на этот элемент, мне нужно написать что-то вроде:
//input[@class="ABC"] AND //*[contains(@data-test-id,'ZZZ')]")
Есть ли способ записать это в одном XPath?
Ответ №1:
Используйте либо следующий Xpath, либо css-селектор.
Xpath:
//a[@class='ABC' and contains(@data-test-id,'ZZZ')]
Селектор Css:
a.ABC[data-test-id*='ZZZ']
Комментарии:
1. Спасибо — я использовал опцию XPath, и это сработало! Я не смог найти хороший ресурс для чтения по соответствующему синтаксису — не могли бы вы направить меня?
2. Вы можете изучить это у Edureka. Однако, если вы загуглите, доступно множество блогов и веб-сайтов.
Ответ №2:
Вы можете написать составные предикаты в XPath следующим образом:
//a[@class='ABC' and contains(@data-test-id,'ZZZ')]
или
//a[@class='ABC'][contains(@data-test-id,'ZZZ')]
Будьте осторожны с, contains()
поскольку его проверка подстроки может привести к ложным срабатываниям: ZZZ
также является подстрокой ZZZZ
, например. Этот более сложный тест может избежать проблемы для значений с разделителями, таких как у вас с |
:
//a[@class='ABC'][contains(concat('|',@data-test-id,'|'), '|ZZZ|')]
Комментарии:
1. … и, конечно, аналогичная идиома может быть применена к
@class
атрибуту, разделенному пробелом, если необходимо.2. Спасибо! Это работает, мне просто пришлось заменить ‘input’ на ‘a’! Я не смог найти хороший ресурс для чтения соответствующего синтаксиса — не могли бы вы направить меня?
3. Я обновил ответ, чтобы использовать
a
вместоinput
. (Извините, я просмотрел ваш оригинальный XPath, а не ваш оригинальный пример разметки.)4. Исходная рекомендация XPath 1.0 замечательно читаема и является хорошим началом, прежде чем переходить к улучшениям, доступным в XPath 2.0 и 3.0 . Если вы предпочитаете книгу, возьмите копию книги Майкла Кея по XSLT, которая также охватывает XPath.
5. @kjhughes Я отредактировал двойные кавычки на одинарные кавычки для единообразия. Дайте мне знать, устраивает ли вас редактирование.