Альтернативы использованию selenium XPATH для поиска элемента?

#python #selenium-webdriver

#python #selenium-webdriver

Вопрос:

На этом веб-сайте я пытаюсь найти элемент на основе его XPATH, но XPATH продолжает меняться. Какова следующая лучшая альтернатива?

Фрагмент с веб-сайта

 <button class="KnkXXg vHcWfw T1alpA kiPMng AvEAGQ vM2UTA DM1_6g _-kwXsw Mqe1NA SDIrVw edrpZg" type="button" aria-expanded="true"><span class="nW7nAQ"><div class="VpIG5Q"></div></span></button>
  

XPATH:

 //*[@id="__id15"]/div/div/div[1]/div[2]/div
#Sometimes id is a number between 15-18

//*[@id="__id23"]/div/div/div[1]/div[2]/div
#Sometimes id is a number between 13-23
  

Вот как я использую код:

 element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, """//*[@id="__id3"]/div/div/div[1]/div[2]/div/div/div/button"""))).click()
  

Я попытался щелкнуть элемент, найдя класс button, но по какой-то причине он ничего не сделает.

 element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "KnkXXg vHcWfw T1alpA kiPMng AvEAGQ vM2UTA DM1_6g _-kwXsw Mqe1NA SDIrVw edrpZg"))).click()

  

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

1. Я бы посмотрел на селекторы CSS, они могут быть более гибкими, если все сделано правильно. Они не сломаются, если переместить местоположение компонента. Использование имен классов с именами дочерних классов позволило бы извлекать элементы без необходимости знать подробности об иерархии.

2. Я пытаюсь найти элемент на основе его XPATH, но XPATH продолжает меняться. Вы пробовали написать более точный / гибкий XPath? Какова следующая лучшая альтернатива? Вы ознакомились с документацией?

Ответ №1:

Если часть текста постоянно меняется, вы можете использовать contains в xpath.

 //*[contains(@id,"__id"]/div/div/div[1]/div[2]/div