Python 解决SeleniumRC的Time out异常

上一篇 / 下一篇  2012-04-17 09:43:04 / 个人分类:Python3

O!G8?C0E t0http://www.51autotest.com/forum.php?mod=viewthread&tid=115&extra=page%3D1用selenium对web页面进行自动化测试时,会频繁出现"Time out after 3000ms"的异常,且异常出现的位置也很随机,从而导致测试脚本的实现缺乏最基本的稳定性。 这3000ms为selenium默认的超时设置,可以通过selenium.set_timeout('30000')来增加timeout的大小,从而可以在调用selenium.wait_for_page_to_load()时,延长页面加载期间的等待时间。但是标准selenium API提供的这个等待函数对页面加载方面的支持差强人意,有时会出现web页面还未加载完成,但是wait函数自身却已经执行完毕,那web页面最后加载的那部分元素在用selenium进行操作时便会触发异常。 python的time.sleep()函数可人为的进行强制等待,稳定性会强于selenium的wait函数,但是强制等待的时间不能动态设定,这样就会造成测试脚本运行的时间过长,当网络环境不稳定时,之前合适的等待时间就有可能比实际需要的时间要短,致使页面的加载仍未完成。 尝试使用seleniumAPI中的selenium.wait_for_condition(script,timeout)函数,等待关于操作对象的script脚本执行结果为真是,才会进行接下来的操作。但是使用该函数也会出现由于页面没加载完,而导致对指定的element进行操作时引发异常,其中一种情况是在调用wait_for_conditon()函数时,将要操作的element还没有在页面上加载完成。所以还是需要time.sleep()的辅助来决定等待时间。 上述三种方法均达不到稳定性的要求,且效率低,因此可以重写wait函数。要实现wait函数最基本的功能,且保证脚本的稳定性,仅需很少的几行语句便可实现。51Testing软件测试网)UYM T$gu.F

51Testing软件测试网 R2Z,ga5X Fn8u3b,p6rU

class new_selenium(selenium):
!^+dm#o;O.|7k7h5E/eM?h0         def  wait_for(self,locator,timeout):
Sm0BW8tBHVd$N.T0                 waittime = 0
/bw_#u Fk0                 maxtime = int(timeout)/100051Testing软件测试网)fV h9`n2g
                 while(waittime <= maxtime):51Testing软件测试网4j!r&]n(\ T$@-};A
                        ret = False
c1O8uSXMi$M0                        try:
].W.cX f(i M1I`'S I^0                                 ret = self.is_element_present(locator)
$G'uY^ k1O$b0                                  if ret == True:                                   51Testing软件测试网/jo,bb8nC;oO:w
                                         break51Testing软件测试网ClW-h8ZC,z z
                                  else:51Testing软件测试网]?[x(H
                                          pass
{-WNa%Y-`q,`7_ Y0                        except:51Testing软件测试网r\2YA {[@)h
                                  pass
;W6e S`0d%xCu0                         waittime += 151Testing软件测试网9p8E ~D _ r8Xn ~
                         time.sleep(1)51Testing软件测试网#DjX6YP n#T9y
                  if waittime>maxtime:
0U7j'v;TR+U0                          raise Exception,'Time out after %sms' %timeout51Testing软件测试网\A0a hT/x

51Testing软件测试网FtY%I%]/_9k/Kon

 51Testing软件测试网k u Pb}-b/Dr6Xcm

s"a zR!N0 

&J+^*egDK \ TPI051Testing软件测试网;nI5t6I"bi w@

        在这里,创建selenium的子类,在子类中定义wait函数,参数中timeout为设定的超时时间,locator为要验证的element的位置。该例子所实现的功能是,重复验证某个element是否存在,直至element被捕捉到然后退出,从而判断整个页面的加载情况。当然,前提条件是很确定页面包含有将要进行操作的element。如果此element确实不存在,则只有当waittime大于timeout时才会退出while循环并且引发Time Out异常

v+LcX5b$I`p*f-Z0

TAG:

 

评分:0

我来说两句

Open Toolbar