【问题标题】:splinter is_text_present() causes intermittent StaleElementReferenceException with Firefox (but not Chrome or phantomjs)splinter is_text_present() 导致 Firefox 出现间歇性 StaleElementReferenceException(但不是 Chrome 或 phantomjs)
【发布时间】:2017-01-08 23:55:24
【问题描述】:

在将我的测试环境升级到最新版本的seleniumsplinter 和 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."
  )
)

firefox 从49.0.2 升级到50.1.0
selenium 从 2.46.0 升级到 3.0.2
分裂从0.6.0升级到0.7.5
壁虎司机0.13.0
(以上是发布时的所有最新版本)

【问题讨论】:

    标签: python selenium firefox splinter


    【解决方案1】:

    我通过实现这个在捕获异常时重试的包装器解决了我的问题:

    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

    describes the StaleElementReferenceException.的Selenium源代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多