浅析自动化测试中元素等待的理解

  咱们在作web网站自动化测试的过程当中,会常常遇到web应用程序使用了AJAX技术。当浏览器加载页面的时候,而页面上的元素还未同时被加载完成,那么咱们此时进行元素的定位每每会出现错误,影响咱们在自动化测试工做进程。这样在加载某个元素延迟而形成了ElementNotVisibleException的报错,就会下降自动化脚本的稳定性。如何解决这个问题呢?咱们能够经过设置元素等待改善这种问题形成的负面影响。咱们能够描绘成这种场景,程序员和女朋友约好吃西餐,结果程序员在西餐厅吃的美滋滋回来后看到女朋友还在梳妆台化妆,好奇的问怎么还在化妆没有出门呢?女朋友内心顿时无名的火涌上心头,欺负我慢不和你谈对象了,抛个异常跟你分手。程序员

  webdriver为咱们提供了三种等待方法:web

  一、强制等待浏览器

  第一种是办法简单粗暴就是强制等待sleep(),强制让程序员等待xx时间,无论女友能不能来到约会地点,仍是已经提早到了,都必须等待xx时间测试

  

1 from time import sleep
2 from selenium import webdriver
3 url='https://www.baidu.com/'
4 driver=webdriver.Chrome()
5 driver.get(url)
6 sleep(3)
7 print(driver.current_url)
8 driver.quit()

 

  这种叫强制等待,无论你浏览器是否加载完了,程序都得等待3秒,3秒一到,继续执行下面的代码,做为调试颇有用,有时候也能够在代码里这样等待,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。网站

  二、隐性等待ui

  第二种方法就比强制等待方法较细腻人性化了,implicitly_wait(xx),咱们能够想象成这样的场景:程序员和女朋友约定好,不论程序员何时到了约定地点,都必需要等女朋友一家子xx秒,若是女朋友一家子这段时间内来了,好的和女朋友手挽手去西餐厅共进晚餐,可是若是女朋友在规定的时间内没赶到,则程序员本身去,结果天然就是女朋友发飙给你抛个异常恶心一下。url

1 from selenium import webdriver
2 url='https://www.baidu.com/'
3 driver=webdriver.Chrome()
4 driver.implicitly_wait(20)#隐性等待,最长等待20s
5 driver.get(url)
6 print(driver.current_url)
7 driver.quit()

隐形等待是设置了一个最长等待时间,若是在规定时间内网页加载完成,则执行下一步,不然一直等到时间截止,而后执行下一步。可是这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是咱们能够看到浏览器标签栏那个小圈再也不转,才会执行下一步,一般页面想要的元素早就在加载完成了,可是由于个别js之类的东西特别慢,得等到页面所有完成才能执行下一步,那咱们须要主题元素出现就能够下一步该如何去作呢,那就要看selenium提供的另外一种等待方式——显性等待wait了。这里须要强调的是:隐性等待对整个driver的周期都起做用,因此只要设置一次便可spa

  三、显性等待调试

  第三种方法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就可以根据判断条件来进行灵活地等待了。它主要的意思是:程序每隔xx秒看如下条件是否知足,若是条件成立了,则执行下一步,不然继续等待,直到超过设置的最长时间,而后抛出TimeoutException。咱们能够想象成这样的场景:程序员和女朋友约定好,不论程序员何时到了约定地点,都必需要等女朋友一家子xx秒,而与第二个场景不一样的是程序员隔一段时间观望主体女朋友是否出现,若来了程序员就不须要再等待,直接拉着女朋友手挽手去西餐厅共进晚餐不用管女朋友一家子了。code

 1 from selenium import webdriver
 2 from selenium.webdriver.support.wait import WebDriverWait
 3 from selenium.webdriver.support import expected_conditions as EC
 4 from selenium.webdriver.common.by import By
 5 url='https://www.baidu.com/'
 6 driver = webdriver.Chrome()
 7 driver.implicitly_wait(20) # 隐性等待和显性等待能够同时用,但要注意:等待的最长时间取二者之中的大者
 8 driver.get(url)
 9 locator = (By.ID, 'su')
10 try:
11     WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
12 finally:
13     driver.close()

上例中,咱们设置了隐性等待和显性等待,在其余操做中,隐性等待起决定性做用,在WebDriverWait..中显性等待起主要做用,但要注意的是:最长的等待时间取决于二者之间的大者,若是隐性等待时间 > 显性等待时间,则该句代码的最长等待时间等于隐性等待时间。

相关文章
相关标签/搜索