WebDriverWait 是 Selenium 中常用的一个类,它允许我们设置在某个条件成立之前等待的最大时间。until 方法是该类的核心方法之一,它接受一个条件对象,直到该条件满足时,等待才会结束。until 方法的常见用法是等待某个元素的可见性、可点击性等条件。
WebDriverWait 的基本用法:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 示例:等待某个元素的可见性
WebDriverWait(driver, 5, 0.5).until(
EC.visibility_of_element_located((By.ID, "element_id"))
)
until 方法常用的条件(expected_conditions)
expected_conditions 模块提供了一些常用的等待条件。以下是一些常用的条件方法:
1. presence_of_element_located(locator)
等待某个元素出现在 DOM 中,不一定可见,但它必须存在。
WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.ID, "element_id"))
)
2. visibility_of_element_located(locator)
等待某个元素可见,即元素必须在 DOM 中存在且可见。
WebDriverWait(driver, 5).until(
EC.visibility_of_element_located((By.ID, "element_id"))
)
3. element_to_be_clickable(locator)
等待某个元素可点击,即元素存在且可见且启用。
WebDriverWait(driver, 5).until(
EC.element_to_be_clickable((By.ID, "element_id"))
)
4. alert_is_present()
等待弹出警告框(alert)出现。
WebDriverWait(driver, 5).until(
EC.alert_is_present()
)
5. frame_to_be_available_and_switch_to_it(locator)
等待一个 iframe 可用并切换到它。
WebDriverWait(driver, 5).until(
EC.frame_to_be_available_and_switch_to_it((By.ID, "iframe_id"))
)
6. invisibility_of_element_located(locator)
等待某个元素消失,元素不可见且从 DOM 中移除。
WebDriverWait(driver, 5).until(
EC.invisibility_of_element_located((By.ID, "element_id"))
)
7. staleness_of(element)
等待元素不再附属于 DOM 中。通常用于等待页面刷新或元素更新时,元素的 “staleness”。
WebDriverWait(driver, 5).until(
EC.staleness_of(element)
)
8. text_to_be_present_in_element(locator, text)
等待某个元素包含指定的文本。
WebDriverWait(driver, 5).until(
EC.text_to_be_present_in_element((By.ID, "element_id"), "Expected Text")
)
9. text_to_be_present_in_element_value(locator, text)
等待元素的 value 属性包含指定的文本。
WebDriverWait(driver, 5).until(
EC.text_to_be_present_in_element_value((By.ID, "input_id"), "Expected Value")
)
10. visibility_of(element)
等待某个已经定位的元素可见。
WebDriverWait(driver, 5).until(
EC.visibility_of(element)
)
11. number_of_elements_to_be_located(locator, num)
等待指定数量的元素出现在页面中。
WebDriverWait(driver, 5).until(
EC.number_of_elements_to_be_located((By.CLASS_NAME, "class_name"), 3)
)
12. presence_of_all_elements_located(locator)
等待页面中所有符合条件的元素都已经加载并存在。
WebDriverWait(driver, 5).until(
EC.presence_of_all_elements_located((By.CLASS_NAME, "class_name"))
)
13. new_window_is_opened(current_handles)
等待新的窗口被打开。
current_handles = driver.window_handles
WebDriverWait(driver, 5).until(
EC.new_window_is_opened(current_handles)
)
综合使用 WebDriverWait
有时我们会结合多个条件进行等待。比如,等待元素可见且可点击:
WebDriverWait(driver, 5).until(
EC.element_to_be_clickable((By.ID, "element_id"))
)
或等待多个元素出现:
WebDriverWait(driver, 5).until(
EC.presence_of_all_elements_located((By.CLASS_NAME, "class_name"))
)