Селен не может найти элемент при использовании find_element через Python

#python #selenium #xpath #css-selectors #webdriverwait

#python #селен #xpath #css-селекторы #webdriverwait

Вопрос:

Продолжайте получать unable to locate element сообщение об ошибке.

Первый элемент поиска с помощью xpath прошел нормально, но второй вызывает у меня затруднения.

Вот мой код:

 import XLUtils
from selenium import webdriver

driver=webdriver.Chrome(executable_path="C:Chrome_DriverChromedriver.exe")
driver.get("https://www.canada.ca/en/revenue-agency/services/e-services/e-services-businesses/payroll-deductions-online-calculator.html")

driver.find_element_by_xpath('/html/body/main/div[1]/div[7]/p/a[1]').click()
driver.find_element_by_xpath('//*[@id="welcome_button_next"]').click()
  

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

1. Вы не хотите использовать XPaths с таким количеством уровней или индексов, потому что это делает их хрупкими (с большей вероятностью поломки). Лучшим первым локатором был бы селектор CSS, a.btn-primary . Для второго локатора не находите по XPath, когда у вас есть только идентификатор. Вместо этого используйте .find_element_by_id("welcome_button_next").

2. Кроме того, вам необходимо добавить соответствующий HTML-код к вопросу. Предоставление ссылки приятно, но если HTML изменится в будущем, вопрос не будет полезен и не сможет стоять сам по себе.

Ответ №1:

Вам нужно будет немного подождать Next , пока появится кнопка.

 from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

wait = WebDriverWait(driver, 10)

e = wait.until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="welcome_button_next"]'))
    )
e.click()
  

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

1. Вы не хотите ждать присутствия здесь, а затем щелкнуть. Присутствие указывает на то, что элемент находится в DOM, но не обязательно виден или доступен для просмотра. Вместо этого вы хотите дождаться интерактивного.

2. Спасибо за ваш комментарий! Действительно ценю это!

Ответ №2:

Чтобы щелкнуть элемент с текстом в качестве следующего, вам нужно вызвать WebDriverWait, чтобы элемент был интерактивным, и вы можете использовать любое из следующих решений:

  • Использование CSS_SELECTOR :

     WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.btn.btn-primary#welcome_button_next"))).click()
      
  • Использование XPATH :

     WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='btn btn-primary' and @id="welcome_button_next"]"))).click()
      
  • Примечание: необходимо добавить следующий импорт :

     from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
      

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

1. Вместо того, чтобы «спамить» вопросы с большим количеством ответов, которые практически точно совпадают с существующими ответами, почему бы вам не помочь исправить другие ответы, которые близки к идеальным?

2. Спасибо за ваш комментарий! Действительно ценю это!