首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Selenium:如果在找到元素后立即使用,则为StaleElementReferenceException

问Selenium:如果在找到元素后立即使用,则为StaleElementReferenceException
EN

Stack Overflow用户
提问于 2015-06-11 10:17:29
回答 2查看 182关注 0票数 0

几周前我编写了selenium测试,它们在执行时运行良好。

现在,我在每个测试用例中都有一个StaleElementReferenceException异常。我做了一些研究,当一个DOM元素被删除或者不再附加到DOM (文档)时,这个异常就会发生。问题是在我搜索它之后我就用它了。

代码语言:javascript
复制
driver.find_element_by_id("id_subject").clear()

如果没有找到元素,那么就会引发NoSuchElementException,并且在找到元素之后立即引用它,那么为什么它会引发一个StaleElementReferenceException?

完整回溯:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/somepath_to/tests/test_selenium.py", line 490, in test_donation_python
    driver.find_element_by_id("id_subject").clear()
  File "/somepath_to/env/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 73, in clear
    self._execute(Command.CLEAR_ELEMENT)
  File "/somepath_to/env/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 402, in _execute
    return self._parent.execute(command, params)
  File "/somepath_to/env/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 175, in execute
    self.error_handler.check_response(response)
  File "/somepath_to/env/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 166, in check_response
    raise exception_class(message, screen, stacktrace)
StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=45.0.2421.0)
  (Driver info: chromedriver=2.15.322455 (ae8db840dac8d0c453355d3d922c91adfb61df8f),platform=Mac OS X 10.7.5 x86_64)

我有:

  • 30秒implicitly_wait
  • Chrome驱动程序
  • 硒版本: 2.46.0
EN

回答 2

Stack Overflow用户

发布于 2015-06-11 10:20:15

我过去也有过同样的问题。

我没有使用python,但是这个问题是由jquery刷新页面更改DOM造成的,这些元素不再有效。这可能就是问题所在,尽管这种例外还有其他原因。

票数 0
EN

Stack Overflow用户

发布于 2015-06-11 10:49:49

BlunT已经给出了最有可能的场景:您有一个在find_element_by_id("id_subject")执行之后,但在.clear()执行之前刷新DOM的进程。

因为DOM刷新通常是异步的,所以有时您的Selenium代码会正常工作,有时会失败。

在过去,我使用两种一般方法解决了这个问题:

  1. 我已经对Selenium测试进行了编码,以等待刷新完成。这适用于我自己编写的代码,或者如果我使用的工具是相当有文档的。后者的一个例子是DataTables。执行刷新表的操作后,可以等到表刷新后再继续。
  2. 对于基本上无法完成上述操作的情况,我会重新尝试,直到没有得到异常为止。类似于: 试试看: driver.find_element_by_id("id_subject").clear()突破#我们完蛋了!除了StaleElementReferenceException: pass #继续循环。 只有当您在DOM刷新之前或之后执行clear()操作并不重要时,此操作才能工作。如果它确实重要,那么您就不能使用此方法。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30778022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档