wiki:webtest/timeout

selenium访问资源timeout时应对方案

当我们selenium访问资源时,可能会网络超时,这个网络超时的原因可能是资源中的依赖的某一资源无法访问,或网络异常。
还有可能是瞬间无法访问,或selenim不够稳定引起的。如果是瞬间无法访问或selenim缺乏健壮性引起的,我们是可以避免因为网络超时引起的测试失败。
为了重现网络超时,我们将超时时间设置短一点,设置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"))
	......