当前位置: 首页 > article >正文

Selenium 的四种等待方式及使用场景

Selenium 的四种等待方式及使用场景

  1. 隐式等待(Implicit Wait)
  2. 显式等待(Explicit Wait)
  3. 自定义等待(Custom Wait)
  4. 固定等待(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()

四种等待方式对比

等待方式优点缺点适用场景
隐式等待全局生效,代码简洁不够灵活,无法单独为某元素设置等待条件静态页面,目标元素加载时间固定
显式等待灵活性高,可设置条件和单独的超时时间代码复杂,需要明确等待条件动态页面,特定元素需要等待某些条件完成时
自定义等待满足特定场景需求,可实现复杂逻辑条件判断需要手动实现逻辑,代码复杂条件特殊且显式等待无法满足的场景
固定等待简单直接,适合调试低效,不灵活,可能浪费时间调试代码、加载时间固定的静态场景

http://www.kler.cn/a/470422.html

相关文章:

  • 搭建企业AI助理的创新应用与案例分析
  • js可不使用document直接根据id获取id元素
  • JVM实战—OOM的定位和解决
  • 51单片机——共阴数码管实验
  • 面向对象分析与设计Python版 活动图与类图
  • 51单片机——步进电机模块
  • C# 检查一个字符串是否是科学计数法格式字符串 如 1.229266E+01
  • Requests聚焦爬虫-数据解析
  • 项目48:简易语言学习助手【源代码】 --- 《跟着小王学Python·新手》
  • 线程的创建与管理:Java的多重身份
  • 【React】刷新页面或跳转路由时进行二次确认
  • 【问题记录】SpringBoot 解决 getReader() has already been called for this request 错误
  • F#语言的计算机基础
  • HTML - <link>
  • 03、MySQL安全管理和特性解析(DBA运维专用)
  • Python:类方法、实例方法与静态方法深度解析(补)
  • (安卓无线调试)ADB 无法连接及 Scrcpy 问题排查指南
  • 机器学习算法---贝叶斯学习
  • 城市安全风险综合监测预警平台
  • 阿里云 人工智能与机器学习
  • 动漫推荐系统django+vue前台后台完整源码
  • 这是什么操作?强制迁移?GitLab 停止中国区用户访问
  • 专业学习|BFS算法介绍以及实现框架
  • RK3588平台开发系列讲解(系统篇)Linux Kconfig的语法
  • AI赋能运维:实现运维任务的智能化自动分配
  • 2025.1.2