Сбор ссылок с использованием Selenium приводит к StaleElementReferenceException

#python #python-3.x #selenium #selenium-webdriver

#python #python-3.x #селен #selenium-webdriver

Вопрос:

Я некоторое время искал в Stackoverflow, пытаясь найти исправление для моего конкретного варианта использования, поскольку я продолжаю время от времени получать исключение StaleElementReferenceException (не все время), но ничего, что я нахожу, похоже, не работает.

Я пытаюсь очистить страницу и собрать все ссылки на странице.

 driver.get(SOME_URL)
links = driver.find_elements_by_tag_name('a')
for link in links:
      href = link.get_attribute('href')
      ... DO_SOMETHING_WITH_HREF ...
 

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

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

1. Соберите все значения href и затем используйте их. ссылки=[link.get_attribute(‘href’) для ссылки в driver.find_elements_by_tag_name(‘a’)]. Затем циклические ссылки для использования. Возможно, вы переходите на другую страницу, и ссылки на ваши элементы станут устаревшими.

Ответ №1:

Исключение StaleElementReferenceException означает, что изменился DOM, для которого была вызвана функция. Поскольку вы что-то сделали со ссылками, вы не можете перебирать все остальное. Мой совет — хранить их в виде списка:

 links.append(href)
 

и в конце вы просматриваете этот список в цикле. Это потому, что вы не взаимодействуете с элементами и не получаете сообщение об ошибке.