Selenium:StaleElementReferenceException何时在找到

时间:2015-06-11 10:17:30

标签: python selenium

几周前我写了硒测试,他们在执行时工作得很好。

现在我在每个测试用例中都得到StaleElementReferenceException个例外。我做了一些研究,当DOM元素被尊重但它被删除或不再附加到DOM(docs)时会发生此异常。问题是我在搜索后立即使用它。

driver.find_element_by_id("id_subject").clear()

如果找不到该元素,则会引发NoSuchElementException,并且在找到该元素后立即引用它,为什么它会引发StaleElementReferenceException

完整追溯:

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)

我有:

  • hiddenly_wait 30秒
  • Chrome驱动程序
  • selenium v​​ersion:2.46.0

2 个答案:

答案 0 :(得分:0)

过去我遇到过同样的问题。

我没有使用python,但问题是由更改DOM的页面的jquery刷新引起的,并且元素不再有效。这可能是问题,即使有其他原因导致此类例外。

答案 1 :(得分:0)

BlunT已经为您提供了最可能的方案:您有一个进程在执行find_element_by_id("id_subject")之后但在.clear()执行之前刷新DOM。

由于DOM刷新通常是异步的,因此有时您的Selenium代码可以正常工作,有时它会失败。

我过去使用过两种常规方法解决了这个问题:

  1. 我已经对我的Selenium测试进行编码,等待刷新完成。这适用于我自己编写的代码,或者我使用的文档相当充分。后者的一个例子是DataTables。在执行刷新表的操作时,可以等到表刷新后再继续。

  2. 对于我基本上无法执行上述操作的情况,我会重试,直到我没有得到异常。类似的东西:

    while True:
        try:
            driver.find_element_by_id("id_subject").clear()
            break # We're done!
        except StaleElementReferenceException:
            pass # Continue looping.
    

    仅当无论您是在 DOM刷新之前执行clear()操作还是在之后执行时,这都有效。如果确实很重要,那么就不能使用这种方法。