python selenium — как заставить webdriver использовать XPATH версии 2.0

#python #selenium #selenium-webdriver

#python #selenium #selenium-webdriver

Вопрос:

Я пытаюсь сделать webdriver / browser способным обрабатывать XPATH версии 2.0.

Использование старой версии XPATH — это нормально, но в определенном конкретном случае мне также нужно будет обработать XPATH версии 2.0.

Я попробовал провести некоторые исследования по этому поводу, но до сих пор не имею понятия.

Допустим, я хочу получить все <a> элементы, которые содержат атрибут title or href :

 # find elements by xpath in older version
driver.find_elements_by_xpath("//a[@title or @href]")

# I want the code to be able to process XPATH version 2.0
driver.find_elements_by_xpath("//a/(@title|@href)")

  

Я ожидаю, что смогу найти некоторую конфигурацию (или какой браузер мне следует использовать) для обеспечения доступности обработки XPATH версии 2.0.

Комментарии:

1. При этом будут выбраны атрибуты, а не элементы. Это то, что вы имели в виду?

2. @pguardiario Я имею в виду выбрать элементы, содержащие эти атрибуты. таким образом, он не будет извлекать <a> то, чего не было href или title

3. Зачем прилагать все усилия, чтобы найти способ выполнить локаторы 2.0, когда вы можете преобразовать их в локаторы, совместимые с 1.0? Ваш первый локатор будет делать то, что вы хотите. Можете ли вы предоставить локатор 2.0, который вы хотите использовать, который нельзя преобразовать в эквивалентный 1.0?

4. Текущая версия Chrome сообщает, что ваш второй XPath недействителен.

5. @JeffC это то, что я хочу исправить. Второй XPath является допустимой XPath версии 2.0, но Chrome ее не поддерживает. Существует случай, когда указанный XPath всегда будет из XPath версии 2.0.

Ответ №1:

Вот плагин jquery для xpath 2.0

после внедрения этого вместе с jquery:

 for script in ['jquery.js', 'jquery.xpath.js']:
  with open(script, errors='ignore') as f:
    driver.execute_script(f.read())
  

вы должны уметь выполнять выражения xpath 2.0:

 driver.execute_script('return $(document).xpath("count(//a)")')