在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,由于网络延迟、浏览器卡顿或者异步加载等原因,会出现元素加载超时的情况,如果超出时间仍然定位不到元素,就会抛出异常,中止脚本执行。因此,Selenium提供了三种等待的方式来避免这种偶然失败。下面介绍这三种等待方式。
一、time.sleep(固定等待)
可以通过该方法自定义等待时间,依照该设定的时间进行等待
1、导入该模块
from time import sleep
2、代码示例
下方示例在在百度页面输入关键词并点击搜索,每次加载时间,在输入之后和搜索之后分别等待2s查看效果。
self.driver.get("https://www.baidu.com")#加载百度页面
input=self.driver.find_element(By.ID,"kw")#定位输入框元素
input.send_keys("selenium")#输入搜索关键词
sleep(2)#自定义等待时间为2s
button=self.driver.find_element(By.ID,"su")#定位到按钮
button.click()#点击查找
sleep(2)#强制等待2s
self.driver.quit()
二、implicitly_wait(隐式等待)
隐式等待实际是设置了一个最长等待时间a,如果在规定时间b内页面加载完成,则执行下一步,否则一直等待该最长时间a结束,然后执行下一步。
注:隐式等待是全局等待,对整个driver周期都起作用,在最开始设置一次就可以。
代码示例
self.driver.implicitly_wait(10)#设置最长等待时长为10s
self.driver.get("https://www.baidu.com")#加载百度页面
self.driver.find_element(By.ID, "kw").send_keys("python")#输入关键词
self.driver.find_element(By.ID,"su").click()#点击查找
三、WebDriverWait(显式等待)
显式等待是一种动态的等待方式,每隔一段时间检查一下页面是否达到等待条件,条件成立则执行下一步,若到达设置的最长等待时间条件仍未满足,则抛出异常。
Selenium提供了WebDriverWait类,用于针对指定的元素设置等待。
1、导入WebDriverWait类的路径
from selenium.webdriver.support.wait import WebDriverWait
2、WebDriverWait类参数
参数 | 参数说明 | |
---|---|---|
1 | driver | 传入WebDriver实例 |
2 | timeout | 超时时间,等待的最长时间 |
3 | poll_frequency | 调用until或until_not中的方法的时间间隔,默认是0.5s |
4 | ignored_expections | 忽略的异常,可以设置该异常是否要忽略 |
常用的是前两个参数,后两个参数一般是默认的设置。
实例化WebDriver对象示例:
wait=EC(self.driver,2)#实例化WebDriverWait类对象,在2s内每隔0.5s检查一次
3、WebDriver模块的两个方法
(1)until(self,method,message:str=""):返回true则判断成功
(2)until_not(self,method,message:str=""):返回false则判断成功
这两个方法用于设置等待条件来判断是否执行下一步。
参数 | 参数说明 | |
---|---|---|
1 | method | 等待条件,在一定等待时间内,每隔一段时间调用这个传入的方法,直到该方法返回值不是False(until)/True(until_not) |
2 | message | 如果超时,抛出TimeoutExpection,将message传入异常 |
until中的等待条件通常与expected_conditions连用,该模块内部封装了多个判断方法,比如tite_is():精准匹配页面标题,匹配成功返回true,失败返回false
4、代码示例
self.driver.get("https://www.baidu.com") # 加载百度页面
wait=WebDriverWait(self.driver,2)#实例化WebDriverWait类对象,每隔0.5s检查一次
wait.until(EC.title_is('百度一下,你就知道'))#每隔一段时间调用title_is(),直到该标题为’百度一下,你就知道‘
self.driver.find_element(By.ID, "kw").send_keys("python")
self.driver.find_element(By.ID, "su").click()
四、总代码
点击查看代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
class TestCase():
def __init__(self):
self.driver=webdriver.Edge()#驱动浏览器
#测试固定等待sleep()
def test_sleep(self):
self.driver.get("https://www.baidu.com") # 加载百度页面
input=self.driver.find_element(By.ID,"kw")#定位输入框元素
input.send_keys("selenium")#输入搜索关键词
sleep(2)#自定义等待时间为2s
button=self.driver.find_element(By.ID,"su")#定位到按钮
button.click()#点击查找
sleep(2)#强制等待2s
self.driver.quit()
#测试显式等待
def test_implicity(self):
self.driver.implicitly_wait(10)#设置最长等待时长为10s
self.driver.get("https://www.baidu.com")#加载百度页面
self.driver.find_element(By.ID, "kw").send_keys("python")
self.driver.find_element(By.ID,"su").click()
#测试隐式等待
def test_wait(self):
self.driver.get("https://www.baidu.com") # 加载百度页面
wait=WebDriverWait(self.driver,2)#实例化WebDriverWait类对象,每隔0.5s检查一次
wait.until(EC.title_is('百度一下,你就知道'))#每隔一段时间调用title_is(),直到该标题为’百度一下,你就知道‘
self.driver.find_element(By.ID, "kw").send_keys("python")
self.driver.find_element(By.ID, "su").click()
if __name__=="__main__":
case=TestCase()#实例化TestCase对象
#case.test_sleep()#调用方法
#case.test_implicity()
case.test_wait()