将我的测试环境升级到最新版本的Selenium,splinter和Firefox后,我的一个测试现在使用Firefox失败了大约80%,如下所示:
Traceback (most recent call last):
File "/Users/rbednark/Dropbox/git/quizme_website/questions/tests.py", line 103, in test_login_fails_incorrect_username
"Your username and password didn't match. Please try again."
File "/Users/rbednark/.virtualenvs/quizme-django-1.6.5/lib/python2.7/site-packages/splinter/driver/webdriver/__init__.py", line 302, in is_text_present
self.driver.find_element_by_tag_name('body').text.index(text)
File "/Users/rbednark/.virtualenvs/quizme-django-1.6.5/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 73, in text
return self._execute(Command.GET_ELEMENT_TEXT)['value']
File "/Users/rbednark/.virtualenvs/quizme-django-1.6.5/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 494, in _execute
return self._parent.execute(command, params)
File "/Users/rbednark/.virtualenvs/quizme-django-1.6.5/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
self.error_handler.check_response(response)
File "/Users/rbednark/.virtualenvs/quizme-django-1.6.5/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
raise exception_class(message, screen, stacktrace)
StaleElementReferenceException: Message: The element reference is stale. Either the element is no longer attached to the DOM or the page has been refreshed.
请注意,同样的测试在使用Chrome和phantomjs时100%通过。 测试:
self.browser.visit(self.live_server_url)
self.assertEquals(self.browser.title, 'Quiz Me!')
self.browser.find_by_id('id_username')[0].fill(user)
self.browser.find_by_id('id_password')[0].fill(password)
# note that the following click() causes a page load
self.browser.find_by_value('login').click()
self.assertTrue(
self.browser.is_text_present(
"Your username and password didn't match. "
"Please try again."
)
)
火狐从49.0.2
升级到50.1.0
硒从2.46.0
升级为3.0.2
分裂从0.6.0
升级到0.7.5
壁虎司机0.13.0
(以上均为发布时的最新版本)
我通过实现这个包装器解决了我的问题,该包装器在捕获异常时重试:
from selenium.common.exceptions import StaleElementReferenceException
def _loop_is_text_present(text, max_attempts=3):
attempt = 1
while True:
try:
return self.browser.is_text_present(text)
except StaleElementReferenceException:
if attempt == max_attempts:
raise
attempt += 1
灵感来源:http://darrellgrainger.blogspot.com/2012/06/staleelementexception.html
描述 StaleElementReferenceException 的 Selenium 源代码。