一,强制等待
time.sleep(10)
''' 强制性的停止等待10S

二,隐式等待
driver.implicitly_wait(10)
''' 设置全局隐式等待10秒(只需要设置一次,对后续所有找元素操作生效)
优势:一次设置,全局的元素查找都会生效
缺点:只会等待元素存在,无法判断元素是否可点击,可见等。对于非find_element的操作无效

三,显式等待
1,需要导入EC - expected_conditions

点击查看代码
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.example.com")

# 显式等待:等id为"submit"的按钮,最多等10秒,直到它“可点击”
wait = WebDriverWait(driver, 10)  # 创建等待对象,最长等10秒
submit_btn = wait.until(
    EC.element_to_be_clickable((By.ID, "submit"))  # 等待条件:元素可点击
)

# 条件满足后,直接操作元素
submit_btn.click()

优势:针对特定元素生效,不影响全局
缺点:代码比较复杂

常用的EC条件:
这些方法可以直接作为 WebDriverWait.until() 或 until_not() 的参数,大大简化条件判断逻辑。

一、元素存在与可见性相关
EC.presence_of_element_located(locator)
条件:指定定位器(如 (By.ID, "id"))对应的元素在 DOM 中存在(不要求可见)。
示例:等待 id 为 username 的元素存在
wait.until(EC.presence_of_element_located((By.ID, "username")))

EC.presence_of_all_elements_located(locator)
条件:指定定位器对应的所有元素在 DOM 中存在(返回所有匹配元素的列表)。
用途:等待多个元素加载(如列表项)。

EC.visibility_of_element_located(locator)
条件:元素存在且可见(可见指元素尺寸不为 0,且不被隐藏)。
区别于 presence:可见性更严格,确保元素能被用户看到。

EC.visibility_of(element)
条件:已获取的元素对象可见(需先定位到元素,再判断可见性)。

EC.invisibility_of_element_located(locator)
条件:元素不存在,或存在但不可见。
用途:等待加载动画消失、弹窗关闭等。

二、元素交互状态相关
EC.element_to_be_clickable(locator)
条件:元素可见且可点击(常用于按钮、链接等需要点击的元素)。
示例:等待提交按钮可点击后点击
btn = wait.until(EC.element_to_be_clickable((By.ID, "submit")))
btn.click()

EC.element_to_be_selected(element)
条件:已获取的元素(如下拉框选项、复选框)被选中。

EC.element_located_to_be_selected(locator)
条件:定位器对应的元素被选中(与上者的区别是直接传定位器,无需先获取元素)。

EC.staleness_of(element)
条件:已获取的元素从 DOM 中移除(如页面刷新、元素被删除时)。
用途:等待页面跳转或元素更新。

三、文本与属性相关

EC.text_to_be_present_in_element(locator, text_)
条件:定位器对应的元素包含指定文本(精确匹配部分文本即可)。
示例:等待提示框出现 “登录成功” 文本
wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, "tip"), "登录成功"))

EC.text_to_be_present_in_element_value(locator, text_)
条件:元素的 value 属性包含指定文本(常用于输入框)。
示例:等待输入框的值包含 “example”
wait.until(EC.text_to_be_present_in_element_value((By.ID, "input"), "example"))

EC.attribute_contains(locator, attribute_, value_)
条件:元素的指定属性包含目标值(如 class 包含 “active”)。

四、页面与框架相关
E
C.title_is(title)
条件:页面标题精确等于指定字符串。

EC.title_contains(title)
条件:页面标题包含指定字符串。
示例:等待页面标题包含 “百度一下”
wait.until(EC.title_contains("百度一下"))

EC.frame_to_be_available_and_switch_to_it(locator)
条件:指定的 iframe 加载完成,并自动切换到该 iframe 中。
用途:处理嵌套 iframe 时,避免切换过早导致的错误。

EC.url_contains(url)
条件:当前页面 URL包含指定字符串。

EC.url_matches(pattern)
条件:当前页面 URL匹配指定正则表达式。

五、多元素与组合条件

EC.all_of(*expected_conditions)
条件:所有传入的条件同时满足(逻辑 “与”)。
示例:等待元素可见且标题正确
wait.until(EC.all_of(
EC.visibility_of_element_located((By.ID, "box")),
EC.title_contains("首页")
))

EC.any_of(*expected_conditions)
条件:至少一个传入的条件满足(逻辑 “或”)。

六、其他常用
EC.alert_is_present():等待弹窗(alert)出现,返回弹窗对象(可用于后续 switch_to.alert 操作)。

使用注意:
所有 locator 参数需传入元组形式,如 (By.ID, "id")、(By.CSS_SELECTOR, ".class")。
until_not() 与 until() 相反,等待条件不满足时触发(如等待元素消失)。
若需自定义复杂条件,可通过 lambda 或自定义函数实现(无需依赖 EC)。

posted on 2025-11-11 17:01  二咩rw  阅读(32)  评论(0)    收藏  举报