Selenium里的三种等待方式

在自动化测试脚本的运行过程中,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()
posted @ 2024-11-04 23:47  jongjongjong  阅读(35)  评论(0编辑  收藏  举报