StaleElementReferenceException:消息:stale元素参考:元素未使用Selenium和Python附加到页面文档 [英] StaleElementReferenceException: Message: stale element reference: element is not attached to the page document with Selenium and Python

查看:169
本文介绍了StaleElementReferenceException:消息:stale元素参考:元素未使用Selenium和Python附加到页面文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为包含下拉菜单的网站开发硒.

I am working on selenium for a website that consists of dropdown menu.

首先,我们有基本代码:

At first, we have the basic codes:

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://.../')

然后,我正在实现要在下拉菜单中使用的部分.我的目标是为每个下拉选项执行一些操作.

Then I am implementing the part to work on the dropdown. My goal is to perform something for each dropdown option.

我正在做的事情:

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)
   

一切正常.

但是,当我为每个下拉选项执行一些操作时:

However, when I am performing some stuff for each dropdown option:

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)
   

然后只有第一个下拉选项运行,然后显示错误:

Then only the first dropdown option runs and then it shows error:

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)

有人可以帮我解决这个问题吗? 谢谢

Can anyone help me solve this issue? Thanks

推荐答案

此错误消息...

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中.

...implies that the previous reference of the element is now stale and the previous element reference is no longer present within the DOM TREE of the webpage.

此异常背后的常见原因可能是以下之一:

The common reasons behind this this exception can be either of the following:

  • 该元素已更改其在HTML DOM中的位置.
  • 该元素不再附加到DOM TREE.
  • 元素所在的网页已刷新.
  • 元素的先前实例已由JavaScript刷新.
  • The element have changed it's position within the HTML DOM.
  • The element is no longer attached to the DOM TREE.
  • The webpage on which the element was part of has been refreshed.
  • The previous instance of element has been refreshed by a JavaScript.

有关HTML术语的更多详细信息将帮助我们构建更规范的答案.但是,按照您的第一个代码块:

A bit of more details interms of the relevant HTML would have helped us to construct a more canonical answer. However, as per your first code block:

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树.

It seems selecting the <option> elements doesn't result in any changes with in the DOM Tree.

但是在第二个代码块中:

But in your second code block:

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)
    

print(index)之前调用browser.refresh()时, HTML DOM 刷新,并且旧的引用变得陈旧.

As you are invoking browser.refresh() before print(index) all the elements within the HTML DOM gets refreshed and the olden references becomes stale.

因此,当您尝试print(index) StaleElementReferenceException

Hence when you try to print(index) WebDriver complains of StaleElementReferenceException

print(index)之前不需要browser.refresh()行.删除行browser.refresh()将解决您的问题.

You don't need the browser.refresh() line before print(index). Removing the line browser.refresh() will solve your issue.

您可以在以下位置找到几个相关的详细讨论:

You can find a couple of relevant detailed discussion in:

这篇关于StaleElementReferenceException:消息:stale元素参考:元素未使用Selenium和Python附加到页面文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆