一、强制等待: sleep()
强制等待是利用python语言自带的time库中的sleep()方法:
import time
sleep(5) #等待5秒
设置固定休眠时间,单位为秒。
缺点:不智能,使用太多的sleep会影响脚本运行速度,不到万不得已尽可能少用。
二、隐式等待: implicitly_wait()
隐式等待相比强制等待更智能,顾明思义,在脚本中我们一般看不到等待语句,但是它会在每个页面加载的时候自动等待;隐式等待只需要声明一次,一般在打开浏览器后进行声明。
声明之后对整个drvier的生命周期都有效,后面不用重复声明。
driver = webdriver.Chrome()
driver.implicitly_wait(10)
implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完),implicitly_wait(10),超时时间10s,10秒内一旦加载完成,就执行下一条语句;如果10秒内页面都没有加载完,就超时抛出异常。
隐式等待在自动化测试中的运用,看代码:
from selenium import webdriver
import unittest
class TestBase(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Chrome() #驱动浏览器
self.driver.implicitly_wait(10) #设置隐式等待
self.driver.maximize_window() #最大化浏览器
def test(self):
print('这是一个测试用例')
def tearDown(self):
self.driver.quit()
if __name__=='__main__':
unittest.main()
但是隐式等待依然存在一个问题,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步,某些情况下会影响脚本执行速度。
所以,这里webdriver提供了一种更加智能的等待方式:显示等待
三、显示等待: WebDriverWait()
显示等待与隐式等待相对,显示等待必须在每个需要等待的元素前面进行声明。
#引入WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
#引入expected_conditions类,并重命名为EC
from selenium.webdriver.support import expected_conditions as EC
#引入By类
from selenium.webdriver.common.by import By
#设置等待
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.ID,'KW')))
显示等待需要用到两个类:
WebDriverWait和expected_conditions两个类。
1、WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
WebDriverWait()中的until()和until_not()方法:
until
WebDriverWait(driver,10).until(method,message="")
调用该方法提供的驱动程序作为参数,直到返回值为True
method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常
until_not
WebDriverWait(driver,10).until_not(method,message="")
调用该方法提供的驱动程序作为参数,直到返回值为False
与until相反,until是当某元素出现或什么条件成立则继续执行,
until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。
2、expected_conditions类
各种类,达到某种条件,返回True和False
expected_conditions类提供的预期条件判断的方法
显示等待,自定义等待条件
#设置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函数
wait.until(lambda diver:driver.find_element_by_id('kw'))
总结:
其实隐式等待和显示等待在本质上是一致的,只是显示等待多了一个指定元素条件超时时间,在使用场景上,可以使用隐式等待来做一个全局的控制,例如设置全局隐式等待6秒;
如果某个控件比较特殊,需要更长的时间加载,比如十几秒或者更长,就可以使用显示等待对其进行单独处理;