Selenium 的四种等待方式及使用场景
Selenium 的四种等待方式及使用场景
- 隐式等待(Implicit Wait)
- 显式等待(Explicit Wait)
- 自定义等待(Custom Wait)
- 固定等待(Sleep)
1. 隐式等待
定义: 隐式等待是为 WebDriver 设置一个全局的超时时间,在此时间内,如果目标元素未出现,WebDriver 会定期轮询检查该元素是否存在,一旦找到立即继续执行后续代码。
适用场景:
适用于页面加载较慢但元素固定的场景,比如登录后的静态页面。
代码示例:
from selenium import webdriver driver = webdriver.Chrome() # 设置隐式等待为10秒 driver.implicitly_wait(10) driver.get("https://example.com") element = driver.find_element_by_id("some_element") element.click() driver.quit()
2. 显式等待
定义: 显式等待是为某些特定的元素设置等待条件和超时时间,直到满足条件后才会继续执行。常用 WebDriverWait
类和 expected_conditions
模块。
适用场景:
适用于页面动态加载,元素需要特定条件才能出现的情况,例如弹窗加载、按钮变为可点击等。
常用条件:
presence_of_element_located
:等待元素出现在 DOM 中,但不一定可见。visibility_of_element_located
:等待元素出现在 DOM 中且可见。element_to_be_clickable
:等待元素可见并可点击。
代码示例:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("https://example.com") # 设置显式等待条件:等待某按钮元素可点击 wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.ID, "some_button"))) element.click() driver.quit()
3. 自定义等待
定义: 通过编写循环逻辑,自定义等待条件。适合复杂或独特的场景,比如需要检查某些动态值或自定义条件是否满足。
适用场景:
用于特殊条件判断,如根据页面元素的特定属性或文本值动态等待。
代码示例:
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 自定义等待 timeout = 10 poll_frequency = 0.5 # 每0.5秒检查一次 elapsed_time = 0 while elapsed_time < timeout: try: element = driver.find_element_by_id("some_element") if element.is_displayed(): print("Element found!") break except: pass time.sleep(poll_frequency) elapsed_time += poll_frequency else: print("Timeout: Element not found") driver.quit()
4. 固定等待
定义: 使用 Python 的 time.sleep()
方法,强制线程暂停指定的时间,无论目标元素是否已经加载完成。
适用场景:
- 临时调试代码,观察执行过程。
- 页面完全静态、加载时间稳定的场景。
- 作为最后的兜底方案。
代码示例:
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 固定等待5秒 time.sleep(5) # 查找元素并点击 element = driver.find_element_by_id("some_element") element.click() driver.quit()
四种等待方式对比
等待方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
隐式等待 | 全局生效,代码简洁 | 不够灵活,无法单独为某元素设置等待条件 | 静态页面,目标元素加载时间固定 |
显式等待 | 灵活性高,可设置条件和单独的超时时间 | 代码复杂,需要明确等待条件 | 动态页面,特定元素需要等待某些条件完成时 |
自定义等待 | 满足特定场景需求,可实现复杂逻辑条件判断 | 需要手动实现逻辑,代码复杂 | 条件特殊且显式等待无法满足的场景 |
固定等待 | 简单直接,适合调试 | 低效,不灵活,可能浪费时间 | 调试代码、加载时间固定的静态场景 |