浏览器操作练习 · 超时等待

页面加载与元素等待超时设置等操作

首页 浏览器操作导航

页面导读 · 超时与等待

Selenium 稳定性的 核心专题:80% 的"偶发失败"都来自等待问题。本页提供三种等待机制的实时演示,可手动设置秒数对比效果。

三层超时配置:

三种等待对比(面试必问):

参数配置 打开关闭 页面导航 窗口控制 页面信息 元素交互 Cookie操作 截图保存 超时等待

练习 9 · 超时与等待(page_load_timeout / implicitly_wait / WebDriverWait)

📋 练习要求 · 超时与等待
概念 三种等待机制:隐式全局、显式按需(推荐)、页面加载超时 — 不要混用隐式 + 显式
Selenium API implicitly_wait / set_page_load_timeout / WebDriverWait.until / expected_conditions
练习要点
  • driver.set_page_load_timeout(15) 限制 driver.get() 加载时长
  • WebDriverWait(driver, 10).until(EC.presence_of_element_located(...)) 显式等待推荐
  • 显式等待可指定多种条件(出现/可点击/可见/文本包含)
  • ⚠️ 隐式等待和显式等待不要同时设置,会产生不可预期等待
# 快速参考
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver.set_page_load_timeout(15)
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "target"))
)
📋 本节练习清单
  • ✅ 练习目标 1:隐式等待 — driver.implicitly_wait(10) 全局设置,验证 find_element 在元素延迟出现时会自动等待最多 10 秒
  • ✅ 练习目标 2:页面加载超时 — set_page_load_timeout(15) 限制 get() 整体加载时长,超时抛出 TimeoutException
  • ✅ 练习目标 3:显式等待(推荐) — WebDriverWait(driver, 10).until(EC.presence_of_element_located(...)) 等待异步元素出现;拓展使用 element_to_be_clickable 等待按钮可点击
9 练习目标:三种等待 + 页面加载超时综合练习

操作步骤:
① 启动后立即设置 driver.implicitly_wait(10) 隐式等待;
② 设置 driver.set_page_load_timeout(15) 页面加载超时;
③ 打开本练习页,用 driver.execute_script() 触发异步加载,再用 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "async_target"))) 显式等待;
④ 验证超时行为(可选)。

异步加载模拟
点击按钮模拟网络异步加载(3 秒后才在 DOM 中插入目标元素 #async_target)
(等待中...)

关于我们

Python 自动化测试学习平台是一个面向软件测试工程师、开发人员及在校学生的交互式在线学习平台,专注于 Selenium WebDriver 与 Python unittest 自动化测试技能的教学与实践。

我们以"理论 + 实战 + 可交互演示"为核心特色,将八种常规元素定位和Javascript定位、元素操作、自动化测试工具、单元测试、测试模型等知识体系拆分为模块化课程,每个模块都配有可点击、可输入、可运行的模拟练习页面。

平台致力于降低自动化测试的入门门槛,让学习者从"看懂代码"到"动手实操",逐步掌握企业级自动化测试框架的设计与落地能力。

联系方式

📧邮箱:lq@selenium-auto-test.com

📞电话:0755-12345678

📍地址:深圳

💬微信公众号:Selenium自动化测试

🐙GitHub:github.com/selenium-auto-test

免责声明

1. 本平台所有示例代码、演示页面及教程内容均仅供学习交流使用,不构成任何商业推广或技术服务承诺。

2. 平台中的 Selenium API 描述、Python 语法说明均以官方文档为准,如有版本差异请以对应官方文档为准。

3. 学习者在实际项目中应用平台所学内容时,应结合自身项目环境进行充分测试,本平台不对因直接使用示例代码而产生的任何直接或间接损失承担责任。

4. 本平台所引用的第三方库(Selenium、ChromeDriver、unittest 等)版权归其各自作者及维护者所有。

5. 如涉及版权问题或内容建议,请及时通过联系方式与我们沟通,我们将第一时间处理。

三种等待机制对比
隐式等待(implicitly_wait)
对全局所有元素定位生效,每次 find_element 都会等待最多 N 秒,直到元素出现。一次设置全局有效。
显式等待(WebDriverWait + expected_conditions)
针对特定元素,灵活指定等待条件(出现、可点击、可见、文本包含……)。推荐使用。
页面加载超时(page_load_timeout)
限制页面整体加载时长,超时抛 TimeoutException。适用于 driver.get() 阶段。

⚠️ 隐式等待和显式等待不要混用,可能导致不可预期的等待时长。

查看参考答案(Python Selenium)
# 练习 9 参考答案
import os
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.implicitly_wait(10)

# ② 页面加载超时
driver.set_page_load_timeout(15)

# ③ 打开本练习页面(async_target 元素在这个页面里)
# 把下面路径换成你本机 browser_op_practice.html 的绝对路径
practice_html = "file:///" + os.path.abspath("./browser_op_practice.html").replace("\\", "/")
driver.get(practice_html)

# ④ 用 JS 触发异步加载(3 秒后才把 #async_target 插入 DOM)
driver.execute_script("""
    setTimeout(function(){
        var d = document.createElement('div');
        d.id = 'async_target';
        d.textContent = '异步元素已加载';
        d.style.cssText = 'padding:12px;background:#8b5cf6;color:white;border-radius:8px;font-weight:600;';
        document.body.appendChild(d);
    }, 3000);
""")

# ⑤ 显式等待:等待 #async_target 出现(WebDriverWait 推荐方式)
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "async_target"))
    )
    print("✅ 显式等待成功:#async_target 已出现")
except Exception as e:
    print("❌ 显式等待超时:" + str(e))

# (可选)等待元素可见 + 可点击
try:
    visible_el = WebDriverWait(driver, 5).until(
        EC.visibility_of_element_located((By.ID, "async_target"))
    )
    assert visible_el.is_displayed(), "元素不可见"
    print("✅ visibility_of_element_located 通过")
except Exception as e:
    print("❌ 可见性等待超时:" + str(e))

driver.quit()
print("✅ 练习 9 所有断言通过!")