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

Selenium中隐式等待(Implicit Wait)和显式等待(Explicit Wait)的区别

Selenium中隐式等待(Implicit Wait)和显式等待(Explicit Wait)的区别


1)本质区别:它们“等的对象”不一样

隐式等待等的是:

**元素查找(findElement / findElements)**这件事。

也就是说,隐式等待只在你调用driver.findElement(...)这一刻生效:在超时时间内不断重试“查找元素”,找到就返回,找不到就一直试到超时抛异常。

显式等待等的是:

某个明确条件(ExpectedCondition)成立

条件可以是“元素可见/可点击/存在”“URL 变了”“文本出现了”“alert 出现了”等等——它不局限于“找元素”。

这就是为什么你说的那句成立:隐式等待无法等待 alert,因为 alert 不是通过 findElement 找到的 DOM 元素。


2)作用范围:全局 vs 局部

隐式等待:全局配置,一次设置长期生效

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

设置后,只要这个driver还在,后续每一次findElement都会带着这 10 秒的“自动重试”。

显式等待:局部使用,想等哪就等哪

WebDriverWaitwait=newWebDriverWait(driver,Duration.ofSeconds(10));wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("kw")));

你在需要的地方才写一段等待逻辑,不需要的地方不影响。


3)能等什么:隐式等待“只等元素”,显式等待“啥都能等(条件允许)”

隐式等待能等的典型东西

  • 页面元素出现(presence)
  • 页面元素最终能被找到(findElement 成功)

但注意:隐式等待只保证“找到元素”,不保证它:

  • 可见(visible)
  • 可点击(clickable)
  • 不被遮挡
  • 文本已经渲染完

所以隐式等待经常出现“找到了但点不了/拿不到文本”的情况。

显式等待能等的典型东西(举几个高频)

  • 元素可点击:elementToBeClickable
  • 元素可见:visibilityOfElementLocated
  • 元素存在于 DOM:presenceOfElementLocated
  • 文本出现/变为某值:textToBePresentInElementLocated/textToBe
  • URL 变化:urlContains/urlToBe
  • 弹窗出现:alertIsPresent()

示例:等待 alert 出现并接受

WebDriverWaitwait=newWebDriverWait(driver,Duration.ofSeconds(10));Alertalert=wait.until(ExpectedConditions.alertIsPresent());alert.accept();

这段是隐式等待做不到的,因为它根本不走findElement


4)对“找不到元素”行为的影响:异常类型与重试方式

  • 隐式等待:只要findElement没找到,就反复重试;最终超时会抛NoSuchElementException(常见表现)
  • 显式等待:内部轮询条件;最终超时会抛TimeoutException(更像“条件没满足”)

这点在定位问题时很有用:
看到TimeoutException通常说明你等的条件一直没成立,而不是“元素压根不存在”。


5)为什么不建议混用:时间会变得“不可预测”

当你同时开了:

  • 隐式等待 10 秒
  • 显式等待 10 秒

显式等待内部也会反复调用元素查找/条件判断,而这些查找又会被隐式等待“拖住”。最终你以为最多等 10 秒,实际可能更久(常见表现:超时明显大于显式等待设置值)。

实战上更稳的策略通常是:

  • 主用显式等待(精确、可控)
  • 隐式等待要么不用,要么设很小(例如 0~1 秒)避免干扰

6)典型场景对比:你会在哪踩坑

场景 A:元素是动态渲染的(ajax)

  • 隐式等待:能帮你等到“元素出现在 DOM”
  • 显式等待:不仅能等到出现,还能等到“可见/可点/文本更新”

场景 B:点击后出现 alert

  • 隐式等待:无效(alert 不是 DOM 元素)
  • 显式等待:alertIsPresent()一把梭

场景 C:元素存在但被遮挡(弹层/加载动画)

  • 隐式等待:可能找得到但点不了,直接ElementClickInterceptedException
  • 显式等待:可以等到elementToBeClickable(但如果一直被遮挡也会超时)

7)总结

  • 隐式等待:给findElement加“全局重试”,简单但粗糙,等不到 alert,也不擅长等“可点击/可见/文本更新”。
  • 显式等待:按条件等,颗粒度细、可控,能等元素状态、URL、文本、alert等,是写稳定脚本的主力工具。
http://www.cnnetsun.cn/news/720506.html

相关文章:

  • SSM277课程在线考试组卷管理系统vue
  • 大数据毕设项目推荐-基于python的灾情数据可视化系统基于python大数据的自然灾害地震等数据可视化分析系统【附源码+文档,调试定制服务】
  • 我是AI应用架构师,给某制造企业做算力规划的过程,全记录
  • 大数据毕设项目:基于机器学习的网络购物平台的智能推荐(源码+文档,讲解、调试运行,定制等)
  • 达梦数据库使用过程中常见问题
  • 【毕业设计】基于机器学习的网络购物平台的智能推荐(源码+文档+远程调试,全bao定制等)
  • 强烈安利专科生必用TOP8一键生成论文工具
  • 大数据毕设选题推荐:基于django的菜价可视化系统蔬菜销售分析与预测可视化系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 含分布式电源的配电网日前两阶段优化调度模型-无功优化Matlab代码
  • AI多语言混合输入的语种识别测试:测试工程师的破壁之战
  • 【计算机毕业设计案例】基于Python的网络小说分析系统设计与实现(程序+文档+讲解+定制)
  • 【课程设计/毕业设计】基于大数据+django+mysql的学习资源推送系统的设计与实现基于Django+大数据的学习资源推送系统【附源码、数据库、万字文档】
  • 大数据毕设项目:基于django的蔬菜销售分析与预测可视化系统(源码+文档,讲解、调试运行,定制等)
  • 数据即服务在大数据领域的创新应用与实践
  • 【毕业设计】基于Django+大数据的学习资源推送系统(源码+文档+远程调试,全bao定制等)
  • AI让产品经理工作消失?不,是进化:2026年PM的核心能力重塑
  • 2025年最全大模型工具合集:从文本生成到编程开发,一键收藏必备!
  • Python计算机毕设之基于Python的网络小说分析系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 大模型的三条进化路线:OpenAI、DeepMind、DeepSeek如何重塑AI结构
  • 数据中台中的数据服务编排可视化
  • Python语法进阶笔记(五)
  • paperxie 毕业论文:硕士专属智能写作工具,30000 字高质论文轻松交付
  • paperxie 毕业论文:本科通关神器,3000 字原创轻松交付[特殊字符]
  • 使用 pip3 一键卸载当前环境中所有已安装的 Python 包(Linux / macOS / Windows)
  • 计算机毕业设计springboot线上票务系统app 基于Spring Boot的移动票务管理平台开发 Spring Boot框架下的线上票务系统设计与实现
  • Linux运维必备:一个LVM管理添加和扩容脚本的诞生记(完整版)
  • 【Linux 网络】拒绝传输卡顿!滑动窗口如何让数据 “跑赢” 等待?
  • LeetCode 379 电话目录管理系统
  • 04. 引用
  • 当AI刺破泡沫:算力瓶颈、能源战争与资本主义的“物理转向”