Selenium的三种等待方式

目录

Selenium的三种等待方式

1、强制等待

2、隐式等待

3、显性等待


Selenium的三种等待方式

        什么是等待机制?

        等待就是当系统运行时,如果页面渲染的速度跟不上程序执行的速度,这时就需要人为的去

限制计算机的执行速度。例如在WebUI自动化测试的时候,一般要等待页面元素加载完成之后,才

能进行测试操作,否则就会导致找不到元素而报错,这时就需要加入等待时间来让页面元素加载完

成,再进行元素获取操作。

1、强制等待

        Selenium的强制等待是一种在测试过程中使用的技术,用于在执行测试脚本时暂停程序一段

固定的时间。这样做的目的是为了确保在执行下一步操作之前给页面足够的时间加载或响应。

        使用方式:

sleep(秒数) 

        完整代码:

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
"""
    强制等待:
        使用方法:sleep(秒数)
        程序遇到sleep停止运行,时间一到开始执行

"""
# 0.加载驱动
service = Service('E:\\driver\\chromedriver.exe')
# 1.打开浏览器
driver = webdriver.Chrome(service=service)
# 2.输入网址
driver.get("https://www.baidu.com/")
sleep(1)
# 3.找到元素
# 4.输入关键字
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("淘宝")
# 5.点击搜索
driver.find_element(By.ID, "su").click()
# 识别页面是否跳转成功
sleep(5)
ele = driver.find_element(By.XPATH, '//*[@id="1"]/div/div[1]/h3/a[1]')
assert ele != None
print("测试通过")

        优点:可以人为控制具体等待时间。

        缺点:无法准确把握需要等待的时间。如果设置时间过短,操作还未完成,等待时间已到,

会导致测试用例执行报错,影响测试用例的继续执行;如果设置时间过长,操作执行完毕,等待时

间未到,会浪费不必要的等待时间,影响测试用例的执行效率。

2、隐式等待

        隐式等待是在整个页面加载过程中等待元素出现的一种全局性设置。在设置了隐式等待后,

Selenium会在查找元素时等待一定的时间,直到元素出现为止。如果在规定的时间内找到了元

素,则立即执行下一步操作;如果超时了,则抛出NoSuchElementException异常。这样的等待是

全局性的,适用于整个测试脚本。

        使用方式:

driver.implicitly_wait(秒数)

        完整代码:

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
"""
    隐示等待:
        使用方法:driver.implicitly_wait(秒数)
        设置一个最长等待时间,如果在规定的时间内,网页加载完成,则进行下一步
        否则一直等到时间截至,然后执行下一步

"""
# 0.加载驱动
service = Service('E:\\driver\\chromedriver.exe')
# 1.打开浏览器
driver = webdriver.Chrome(service=service)
# 2.输入网址
driver.get("https://www.baidu.com/")
sleep(1)
# 3.找到元素
# 4.输入关键字
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("淘宝")
# 5.点击搜索
driver.find_element(By.ID, "su").click()
# 识别页面是否跳转成功
driver.implicitly_wait(5)
ele = driver.find_element(By.XPATH, '//*[@id="1"]/div/div[1]/h3/a[1]')
assert ele != None
print("测试通过")

        优点:

        ①、全局性设置: 隐式等待是针对整个测试脚本的全局性设置,一次设置就可以应用于整个页

面加载过程,不需要在每个元素操作之前都设置等待条件。

        ②、简单易用: 设置隐式等待非常简单,只需在初始化WebDriver实例时指定等待的时间即

可,不需要额外的代码来处理每个元素的等待。

        ③、适用范围广: 隐式等待适用于整个页面的元素查找,可以应对页面加载时间的不确定性,

提高测试的稳定性和可靠性。

        缺点:

        ①、全局性等待: 虽然全局性设置可以方便应用到整个测试脚本,但有时候并不是所有的元素

都需要相同的等待时间。如果页面上某些元素加载速度较快,而设置的等待时间较长,可能会造成

不必要的等待时间浪费。

        ②、不精确: 隐式等待是按照固定的时间等待元素出现,而不考虑元素实际加载的时间。如果

页面元素加载速度快于设置的等待时间,会导致不必要的等待;反之,如果加载速度慢于等待时

间,可能会导致元素还未完全加载就进行操作,造成测试失败或不稳定的情况。

        ③、难以调试: 由于隐式等待是全局性设置,当测试出现问题时,难以准确定位是等待时间设

置不合理还是页面本身的问题,增加了调试的难度。

3、显性等待

        显式等待是在特定条件下等待特定元素出现的一种更精细化的等待方式。用户可以设置等待

的最长时间和等待的条件,例如等待元素可见、可点击等。一旦等待的条件满足或超时,测试脚本

将继续执行下一步操作。相比于隐式等待,显式等待更灵活,并且可以针对特定的元素设置不同的

等待条件和时间。

        代码如下:

from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

"""
等待机制都一样,都是停止当前代码的继续运行
显性等待更加灵活
    WebDriverWait类  显性等价类
    driver: webDriver 实例
    timeout: 超时时间
    poll_frequency: 间隔时间,默认是0.5
    ignore_exceptions: 忽略异常(元组)   ----一旦发生了我们定义的异常不中断代码继续等待
      
方法 until
method: 在等待期间内,每隔一段时间调用当前方法,如果不能执行返回False,否则返回正常值
message: 如果超时,TimeoutException,把message传入异常

"""

# 0.加载驱动
service = Service('E:\\driver\\chromedriver.exe')
# 1.打开浏览器
driver = webdriver.Chrome(service=service)
# 2.输入网址
driver.get("https://www.baidu.com/")
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("淘宝")
driver.find_element(By.ID, "su").click()
locator = (By.XPATH, '//*[@id="1"]/div/div[1]/h3/a[1]')
WebDriverWait(driver, 5).until(EC.visibility_of_element_located(locator), "没获取到对应元素")
print("当前页面元素已经被获取到")
driver.quit()

        优点:

        ①、精确等待条件: 显式等待允许设置特定的等待条件,如元素可见、可点击等,使等待更加

精确,只有当条件满足时才会继续执行下一步操作。

        ②、灵活性: 相比隐式等待,显式等待更加灵活,可以针对不同的元素设置不同的等待条件和

时间,以适应不同的测试场景。

        ③、减少不必要的等待时间: 通过设置精确的等待条件,可以减少不必要的等待时间,提高测

试执行效率。

        ④、更容易调试: 显式等待将等待条件明确地暴露出来,当测试出现问题时更容易定位到等待

条件不满足的原因,有助于快速定位和解决问题。

        缺点:

        ①、编写复杂: 相比隐式等待,显式等待需要编写更多的代码来设置等待条件和时间,可能会

增加测试脚本的复杂度和维护成本。

        ②、容易出错: 如果设置的等待条件不够准确或者等待时间设置不合理,可能会导致测试失败

或不稳定,需要花费额外的时间来调试和修复问题。

        ③、局部性等待: 显式等待是针对特定的元素设置等待条件和时间,如果测试场景中有大量元

素需要设置等待条件,可能会增加编码和维护的工作量。

  • 26
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值