Логический Selenium XPath И объединение нескольких фильтров contains()?

#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 Я отредактировал двойные кавычки на одинарные кавычки для единообразия. Дайте мне знать, устраивает ли вас редактирование.