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") # 输入关键词
优点:
- 可以灵活控制,只需给出一个等待条件,和超时时间
- 可以根据需求编写等待,可以使脚本执行速度最快
缺点:
隐式等待(Implicit Wait)
隐式等待是一种全局性的设置,默认为关闭状态,它会让Selenium在每次查找元素时都尝试最多等待指定的时间,直到元素出现或者超时。隐式等待只需要在初始化WebDriver时设置一次,就会对后续所有的查找元素操作生效。隐式等待可以通过以下代码实现:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 设置隐式等待为10秒
driver.get("https://www.baidu.com")
优点:
- 页面加载结束后可以立即执行,无需等待完超时时间
- 只需要设置一次,便可以应用在整个测试的生命周期
- 无需编写复杂的等待条件
缺点:
流利等待(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")))
优点:
- 与显示等待相比,可以设置检查条件的频率,忽略的异常
- 可以测试每 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") # 输入关键词
优点:
- 简单方便,不需要导入额外的模块或方法
- 可以满足在某个状态强制等待指定时间的需求
缺点:
- 非常低效,必须等待指定时间,尽管资源已就绪
- 等待时间不足时,可能导致测试结果的不稳定。