Python 自动化中三种等待时间的详解
1.强制等待
强制等待是最简单的一种等待方式,强制让浏览器等待X秒,不管当前操作是否完成,是否可以进行下一步操作,都必须等X秒的时间。使用方法:time.sleep(X) 。在python中是基于time模块的sleep方法来实现。
缺点:
-
不能准确把握需要等待的时间(有时操作还未完成,等待就结束了,导致报错;有时操作已经完成了,但等待时间还没有到,浪费时间)
-
如果在用例中大量使用,会浪费不必要的等待时间,影响测试用例的执行效率。
优点:使用简单,可以在调试时使用。
案例1:
from selenium import webdriver driver = webdriver.Chrome() # 隐式等待 driver.implicitly_wait(10) # 访问百度 driver.get('https://www.baidu.com') # 搜索框输入python driver.find_element_by_id('kw').send_keys('python') # 点击百度一下按钮 driver.find_element_by_id('su').click() # 点击结果中的某一个链接 driver.find_element_by_xpath('//a[@aria-label="python"]').click() driver.quit()
2.隐式等待
隐式等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后再执行下一步操作。使用方法:driver.implicitly_wait(X)。在X时间内,页面加载完成,进行下一步操作。
缺点:
-
使用隐式等待,程序会一直等待整个页面加载完成,才会执行下一步操作;但有时候页面想要的元素早已经加载完成了,但是因为网页上个别元素还没有加载完成,仍要等到页面全部完成才能执行下一步,使用也不是很灵活。
-
在等待时间内页面没有加载完成,时间一到也会进入下一步操作;这种情况可能出现要定位的元素没有出现,从而报元素无法找到的错误。
优点: 隐性等待对整个driver的周期都起作用,每一次操作都会调用隐式等待,所以只要设置一次即可。
案例2:
from selenium import webdriver driver = webdriver.Chrome() # 隐式等待 driver.implicitly_wait(10) # 访问百度 driver.get('https://www.baidu.com') # 搜索框输入python driver.find_element_by_id('kw').send_keys('python') # 点击百度一下按钮 driver.find_element_by_id('su').click() # 点击结果中的某一个链接 driver.find_element_by_xpath('//a[@aria-label="python"]').click() driver.quit()
3.显式等待
显性等待是对指定元素进行等待的一种等待方式。通过设置最大等待时间,检查频率对页面的元素来进行等待,一旦找到元素,则停止等待,进入后续步骤。
它主要的意思就是:程序每隔X秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException异常。
缺点:
-
使用相对比较复杂;
-
和强制等待类似,每一行等待只执行一次,如果要进行多个元素的等待,则需要多次写入
优点: 等待判断准确,不会浪费多余的等待时间,在用例中使用,可以提高执行效率。
使用方法:
from selenium.webdriver.support.wait import WebDriverWait WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None).until(method, message='') # driver:浏览器驱动 # timeout:最大等待时间 # poll_frequency:检测的间隔时间,默认0.5 # ignored_exceptions:超时后的异常信息,默认抛出NoSuchElementException # until()方法:直到条件成立返回为真,等待结束。如果超时,抛出TimeoutException,将message传入异常 # method:在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False,一般使用lambda匿名函数 # message:提示信息,出现异常时会将这个信息输出在控制台
案例3:
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait driver=webdriver.Chrome() # 访问百度 driver.get("https://www.baidu.com") # 搜索框输入python driver.find_element_by_id('kw').send_keys('python') # 点击百度一下按钮 driver.find_element_by_id('su').click() # 链接元素的xpath路径 path = '//a[@aria-label="python"]' # 显示等待:等待结果中要点击的某个链接元素出现 WebDriverWait(driver,10).until(lambda x:x.find_element_by_xpath(path),message='元素没有显示') # 点击结果中的某一个链接 driver.find_element_by_xpath(path).click() driver.quit()