== selenium访问资源timeout时应对方案 == 当我们selenium访问资源时,可能会网络超时,这个网络超时的原因可能是资源中的依赖的某一资源无法访问,或网络异常。 [[BR]] 还有可能是瞬间无法访问,或selenim不够稳定引起的。如果是瞬间无法访问或selenim缺乏健壮性引起的,我们是可以避免因为网络超时引起的测试失败。 [[BR]] 为了重现网络超时,我们将超时时间设置短一点,设置5秒,如下: {{{ ...... self.driver.set_page_load_timeout(5) ...... }}} 接下来,我们去访问版块页 {{{ ...... driver = self.driver driver.get(self.base_url + self.config["test.forum"]) #断言主题管理块 self.assertTrue(self.is_element_present(By.CSS_SELECTOR, "div.forum_admin")) ...... }}} 测试失败,并抛出如下异常信息 {{{ Traceback (most recent call last): File "admin_menu_forum.py", line 24, in test_admin_menu driver.get(self.base_url + self.config["test.forum"]) File "C:\Python27\lib\site-packages\selenium-2.35.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 177, t self.execute(Command.GET, {'url': url}) File "C:\Python27\lib\site-packages\selenium-2.35.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 165, ecute self.error_handler.check_response(response) File "C:\Python27\lib\site-packages\selenium-2.35.0-py2.7.egg\selenium\webdriver\remote\errorhandler.py", line 1 check_response raise exception_class(message, screen, stacktrace) TimeoutException: Message: u'Timed out waiting for page load.' ; Stacktrace: at FirefoxDriver.prototype.get/< (file:///c:/users/pc/appdata/local/temp/tmpnfrz_d/extensions/fxdriver@googlec m/components/driver_component.js:8767) at WebLoadingListener/e (file:///c:/users/pc/appdata/local/temp/tmpnfrz_d/extensions/fxdriver@googlecode.com/c nts/driver_component.js:3330) at WebLoadingListener/< (file:///c:/users/pc/appdata/local/temp/tmpnfrz_d/extensions/fxdriver@googlecode.com/c nts/driver_component.js:3337) at fxdriver.Timer.prototype.setTimeout/<.notify (file:///c:/users/pc/appdata/local/temp/tmpnfrz_d/extensions/f r@googlecode.com/components/driver_component.js:396) }}} 一般我们将超时时间设为20秒,如果超时,我们可以让selenium去重试, {{{ ....... def retry_when_timeout(driver, url, times = 3): u''' 访问超时,重试,默认重试3次 ''' for i in range(0, times): try: print "access %s, times %s" % (url, i+1) driver.get(url) except TimeoutException, e: continue else: break }}} 使用示例如下: {{{ ...... driver = self.driver functions.retry_when_timeout(driver,self.base_url + self.config["test.forum"]) #断言主题管理块 self.assertTrue(self.is_element_present(By.CSS_SELECTOR, "div.forum_admin")) ...... }}}