Программа отлично работает в режиме отладки, но при обычном запуске выдает ошибки

#python #selenium

#python #selenium

Вопрос:

Это мой текущий код, но всякий раз, когда я его запускаю, я получаю ошибку в последней строке

 stale element reference: element is not attached to the page document
  
 from selenium import webdriver

url = "https://otctransparency.finra.org/otctransparency/OtcDownload"
driver.get(url)
driver.maximize_window()
driver.implicitly_wait(5)

agree = driver.find_elements_by_xpath("//button[@class='btn btn-warning']")[0]
agree.click()
nonats = driver.find_element_by_link_text('OTC (Non-ATS) Download')
nonats.click()

driver.find_element_by_xpath("//img[@src='./assets/icon_download.png']").click()
driver.switch_to.window(driver.window_handles[0])

driver.find_element_by_xpath("(//div[@class='checkbox-inline'])[2]").click()
driver.find_element_by_xpath("(//div[@class='checkbox-inline'])[1]").click()

driver.implicitly_wait(5)
button = driver.find_element_by_xpath("//img[@src='./assets/icon_download.png']")
print(button.is_displayed())
button.click()
  

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

Редактировать: это моя трассировка стека

 Traceback (most recent call last):
 File "C:UsersderpeDesktoppython projects personaltesting finrauntitled1.py", line 31, in <module>
    button.click()

  File "C:Usersderpeanaconda3libsite-packagesseleniumwebdriverremotewebelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)

  File "C:Usersderpeanaconda3libsite-packagesseleniumwebdriverremotewebelement.py", line 633, in _execute
    return self._parent.execute(command, params)

  File "C:Usersderpeanaconda3libsite-packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
    self.error_handler.check_response(response)

  File "C:Usersderpeanaconda3libsite-packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)

StaleElementReferenceException: stale element reference: element is not attached to the page document
  (Session info: chrome=86.0.4240.75)
  

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

1. Пожалуйста, укажите трассировку стека ошибки.

Ответ №1:

Нажатие флажка запускает обновление страницы во время поиска ссылки для скачивания.

Вызовите sleep , чтобы разрешить завершение обновления.

 driver.implicitly_wait(5)
import time   # add this 
time.sleep(1)   # add this
button = driver.find_element_by_xpath("//img[@src='./assets/icon_download.png']")
print(button.is_displayed())
button.click()
  

Я пробовал другие ожидания selenium, но они у меня не сработали. Вероятно, потому, что поиск элемента завершается успешно до запуска обновления, но все равно нажимается с опозданием.

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

1. Спасибо за помощь, но я все еще немного в замешательстве, не устанавливает ли implicitly_wait время ожидания завершения команды? Разве это не должно выполнять то же самое, что и time.sleep? Извините, если мои вопросы немного глупые, я все еще немного новичок в python и только начал использовать selenium

2. Я подумал то же самое, но, основываясь на документации, implicitly_wait только ждет, пока элемент не будет найден. Она не останавливается в течение заданного промежутка времени. selenium-python.readthedocs.io/waits.html#implicit-waits