几周前我写了硒测试,他们在执行时工作得很好。
现在我在每个测试用例中都得到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)
我有:
答案 0 :(得分:0)
过去我遇到过同样的问题。
我没有使用python,但问题是由更改DOM的页面的jquery刷新引起的,并且元素不再有效。这可能是问题,即使有其他原因导致此类例外。
答案 1 :(得分:0)
BlunT已经为您提供了最可能的方案:您有一个进程在执行find_element_by_id("id_subject")
之后但在.clear()
执行之前刷新DOM。
由于DOM刷新通常是异步的,因此有时您的Selenium代码可以正常工作,有时它会失败。
我过去使用过两种常规方法解决了这个问题:
我已经对我的Selenium测试进行编码,等待刷新完成。这适用于我自己编写的代码,或者我使用的文档相当充分。后者的一个例子是DataTables。在执行刷新表的操作时,可以等到表刷新后再继续。
对于我基本上无法执行上述操作的情况,我会重试,直到我没有得到异常。类似的东西:
while True:
try:
driver.find_element_by_id("id_subject").clear()
break # We're done!
except StaleElementReferenceException:
pass # Continue looping.
仅当不无论您是在 DOM刷新之前执行clear()
操作还是在之后执行时,这都有效。如果确实很重要,那么就不能使用这种方法。