selenium各种等待的比较

Selenium是一款自动化测试工具,可以模拟用户的操作来测试网页的功能和性能。在使用Selenium进行测试时,经常会遇到一些需要等待的情况,比如页面加载、元素出现、弹窗消失等。为了处理这些等待,Selenium提供了多种不同的等待方法。本文将对selenium的各种等待方式做分析总结。
在selenium官方文档中介绍了selenium支持的三种等待方式显示等待隐式等待流畅等待,在加上编程语言提供的sleep系统库,我们称之为强制等待,一共4种等待方法。

显示等待(Explicit Wait)

显式等待是一种针对特定元素或条件的设置,它会让Selenium在每次满足指定的条件时都尝试最多等待指定的时间,直到条件成立或者超时。显式等待需要结合WebDriverWait和ExpectedConditions类来实现,可以通过以下代码示例:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
wait = WebDriverWait(driver, 10) # 设置显式等待为10秒
input_box = wait.until(EC.presence_of_element_located((By.ID, "kw"))) # 等待输入框出现
input_box.send_keys("selenium") # 输入关键词

优点:

  1. 可以灵活控制,只需给出一个等待条件,和超时时间
  2. 可以根据需求编写等待,可以使脚本执行速度最快

缺点:

  1. 需要针对每个元素或条件单独设置
  2. 需要导入额外的类和方法

隐式等待(Implicit Wait)

隐式等待是一种全局性的设置,默认为关闭状态,它会让Selenium在每次查找元素时都尝试最多等待指定的时间,直到元素出现或者超时。隐式等待只需要在初始化WebDriver时设置一次,就会对后续所有的查找元素操作生效。隐式等待可以通过以下代码实现:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10) # 设置隐式等待为10秒
driver.get("https://www.baidu.com")

优点:

  1. 页面加载结束后可以立即执行,无需等待完超时时间
  2. 只需要设置一次,便可以应用在整个测试的生命周期
  3. 无需编写复杂的等待条件

缺点:

  1. 需要等待页面全部元素加载完毕,有时测试只需等待某个具体元素
  2. 官方警示我们不要混用隐式等待和显示等待,否则等待时间可能同时超过二者设置的最大值

流利等待(FluentWait)

流利等待和显示等待都使用WebDriverWait方法,但是FluentWait 可以定义等待条件的最长时间,以及检查条件的频率。流利等待可以通过以下代码实现:

driver = Firefox()
driver.get("http://somedomain/url_that_delays_loading")
wait = WebDriverWait(driver, timeout=10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div")))

优点:

  1. 与显示等待相比,可以设置检查条件的频率,忽略的异常
  2. 可以测试每 x 秒/分钟后可能出现的元素是否存在

缺点:
相比于显示等待,编写更为复杂

强制等待(Hard Wait)

强制等待是一种最简单也最不推荐的方式,它会让Selenium无条件地暂停执行指定的时间。强制等待可以通过Python内置的time模块来实现,可以通过以下代码示例:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
time.sleep(5) # 强制暂停5秒
input_box = driver.find_element_by_id("kw") # 查找输入框
input_box.send_keys("selenium") # 输入关键词

优点:

  1. 简单方便,不需要导入额外的模块或方法
  2. 可以满足在某个状态强制等待指定时间的需求

缺点:

  1. 非常低效,必须等待指定时间,尽管资源已就绪
  2. 等待时间不足时,可能导致测试结果的不稳定。
posted @ 2023-03-03 17:16  benoqtr  阅读(77)  评论(0编辑  收藏  举报