StaleElementReferenceException: Сообщение: ссылка на устаревший элемент: элемент не прикреплен к документу страницы с помощью Selenium и Python - PullRequest
0 голосов
/ 09 июля 2020

Я работаю над селеном для веб-сайта, который состоит из раскрывающегося меню.

Сначала у нас есть базовые c коды:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select

options = Options()
browser = webdriver.Chrome(chrome_options= options,executable_path=r'C:\Users...chromedriver.exe')
browser.get('http://.../')

Затем я реализую часть работать с раскрывающимся списком. Моя цель - выполнить что-то для каждого варианта раскрывающегося списка.

Когда я делаю:

dropdown = Select(browser.find_element_by_name('DropDownList'))

options = dropdown.options

for index in range(0, len(options) - 1):
    dropdown.select_by_index(index)
    #browser.refresh()
    print(index)
   

Он работает нормально.

Однако, когда я выполняю некоторые данные для каждого варианта раскрывающегося списка:

dropdown = Select(browser.find_element_by_name('DropDownList'))

options = dropdown.options

for index in range(0, len(options) - 1):
    dropdown.select_by_index(index)
    browser.refresh()
    print(index)
   

Затем запускается только первый вариант раскрывающегося списка, а затем отображается ошибка:

0
---------------------------------------------------------------------------
StaleElementReferenceException            Traceback (most recent call last)
<ipython-input-31-fa7ad153fc9f> in <module>
      5 
      6 for index in range(0, len(options) - 1):
----> 7     dropdown.select_by_index(index)
      8     browser.refresh()
      9     print(index)

~\anaconda3\lib\site-packages\selenium\webdriver\support\select.py in select_by_index(self, index)
     97            """
     98         match = str(index)
---> 99         for opt in self.options:
    100             if opt.get_attribute("index") == match:
    101                 self._setSelected(opt)

~\anaconda3\lib\site-packages\selenium\webdriver\support\select.py in options(self)
     45     def options(self):
     46         """Returns a list of all options belonging to this select tag"""
---> 47         return self._el.find_elements(By.TAG_NAME, 'option')
     48 
     49     @property

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in find_elements(self, by, value)
    683 
    684         return self._execute(Command.FIND_CHILD_ELEMENTS,
--> 685                              {"using": by, "value": value})['value']
    686 
    687     def __hash__(self):

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in _execute(self, command, params)
    631             params = {}
    632         params['id'] = self._id
--> 633         return self._parent.execute(command, params)
    634 
    635     def find_element(self, by=By.ID, value=None):

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

~\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

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

Может ли кто-нибудь помочь мне решить эту проблему? Спасибо

1 Ответ

1 голос
/ 09 июля 2020

Это сообщение об ошибке ...

StaleElementReferenceException: Message: The element reference of <span class="pagnCur"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

... означает, что предыдущая ссылка на элемент теперь stale и ссылка на предыдущий элемент больше не присутствует в DOM TREE веб-страницы. .

Общие причины этого исключения могут быть следующими:

  • Элемент изменил свою позицию в HTML DOM.
  • Элемент больше не прикреплен к DOM TREE.
  • Обновлена ​​веб-страница, частью которой был элемент.
  • Предыдущий экземпляр элемента был обновлен на JavaScript.

Этот вариант использования

Немного более подробных сведений в отношении соответствующего HTML помогло бы нам построить более канонический ответ. Однако в соответствии с вашим первым блоком кода:

dropdown = Select(browser.find_element_by_name('DropDownList'))
options = dropdown.options
for index in range(0, len(options) - 1):
    dropdown.select_by_index(index)
    print(index)
    

Кажется, что выбор элементов <option> не приводит к каким-либо изменениям в дереве DOM .

Но во втором блоке кода:

dropdown = Select(browser.find_element_by_name('DropDownList'))
options = dropdown.options
for index in range(0, len(options) - 1):
    dropdown.select_by_index(index)
    browser.refresh()
    print(index)
    

Поскольку вы вызываете browser.refresh() перед print(index), все элементы в HTML DOM обновляются, и старые ссылки становятся устаревший .

Следовательно, когда вы пытаетесь print(index) WebDriver жалуется на StaleElementReferenceException

Решение

Вам не нужна строка browser.refresh() перед print(index). Удаление строки browser.refresh() решит вашу проблему.

Ссылка

Вы можете найти несколько соответствующих подробных обсуждений в:

...