Как обрабатывать ошибки (не удается найти элемент) в Selenium

1

Я пишу бот, используя Selenium для игры, где много щелчков. Иногда он показывает ошибку. Невозможно найти элемент:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: /html/body/div/div[1]/header/div/div[1]/a

У меня есть правильный Xpath, но иногда он дает мне ошибку в разных частях моего кода. Дело не в том, что у меня одна ошибка, и она всегда показывает ошибку в одном месте. Моя проблема в том, что эти ошибки случайны. Я обрабатываю это следующим образом:

try:
    secondPhoto = self.driver.find_element_by_xpath(
                    '/html/body/span/section/main/article/div[2]/div/div[1]/div[1]')
    secondPhotoOpen = ActionChains(self.driver)
    secondPhotoOpen.move_to_element(secondPhoto)
    secondPhotoOpen.click()
    secondPhotoOpen.perform()
except:
    time.sleep(3)
    self.driver.find_element_by_xpath(
                    '/html/body/span/section/main/article/div[1]/div/div/div[1]/div[2]').click()

Это не идеальное решение. Он по-прежнему показывает ошибки, но реже. Я также использую time.sleep. Обычно ошибки появляются, когда я делаю что-то еще в Интернете, или у меня есть задержки (именно по этой причине я использую time.sleep) Теперь у меня около .click() в моем коде и для всех кликов, которые я пытаюсь сделать кроме, но все же он работает неправильно.

  1. У вас есть эффективное решение для этого? Как написать код, который использует .click() на 100% уверен, что он работает независимо от лагов, другой активности браузера?

  2. Как дождаться полной загрузки следующей страницы/изображения после нажатия() (я использую time.sleep)?

Теги:
selenium
selenium-webdriver
click

1 ответ

1
Лучший ответ

Вы можете использовать WebDriverWait:

btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "element_id")))
btn.click()

это будет ждать не менее 10 секунд, пока элемент не будет доступен для кликабельности и только затем щелкнет по нему. Также я бы рекомендовал прочитать это. С помощью WebDriverWait вам не нужно иметь жестко закодированные паузы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню