浏览器操作综合练习

9 个浏览器操作专题 · 含交互式面板与 Selenium 参考答案

首页 环境搭建 元素定位 元素操作 测试工具 单元测试 测试模型

页面导读

本页面提供 9 个浏览器操作模块 的完整练习场景,覆盖 Selenium 核心 API:浏览器参数配置、打开关闭、页面导航、窗口控制、页面信息、元素交互、Cookie 管理、截图、超时与等待。

每个模块均包含 练习要求描述卡(概念标签 + Selenium API 标签 + 练习要点清单 + 快速参考代码块)和 效果展示区域,点击下方卡片可跳转到对应练习,或按顺序逐个闯关。

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

练习 1 · 参数配置(无头模式 / User-Agent / 窗口尺寸)

📋 练习要求 · 参数配置
概念 ChromeOptions 统一管理浏览器启动参数,一次配置全程生效
Selenium API webdriver.Chrome / Options.add_argument / driver.execute_script / driver.get_window_size
练习要点
  • 用 Options() 创建配置对象,add_argument 添加 --headless / --user-agent / --window-size
  • driver = webdriver.Chrome(options=opts) 启动浏览器
  • driver.execute_script('return navigator.userAgent') 断言 UA 包含自定义值
  • driver.get_window_size() 断言 width=1280, height=720
# 快速参考
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
opts = Options()
opts.add_argument("--headless=new")
opts.add_argument("--user-agent=MyAgent/5.0")
opts.add_argument("--window-size=1280,720")
driver = webdriver.Chrome(options=opts)
assert "MyAgent" in driver.execute_script('return navigator.userAgent')
driver.quit()
📋 本节练习清单
  • ✅ 练习目标 1:无头模式 — 用 Options() 创建配置对象,add_argument("--headless=new") 启动无界面浏览器,验证无窗口模式下 get() 与断言仍可正常执行
  • ✅ 练习目标 2:自定义 User-Agent — add_argument("--user-agent=MyAgent/5.0") 后,用 driver.execute_script('return navigator.userAgent') 断言返回值包含自定义 UA
  • ✅ 练习目标 3:启动窗口尺寸 — add_argument("--window-size=1280,720") 启动浏览器,用 get_window_size() 断言 width=1280、height=720
1 练习目标:Options 配置无头模式、自定义 UA、启动时窗口尺寸

操作步骤:
① 使用 ChromeOptions 添加 --headless 参数启动无头浏览器;
② 使用 add_argument('--user-agent=XXX') 设置自定义 UA 并断言 driver.execute_script('return navigator.userAgent') 包含该值;
③ 使用 --window-size=1280,720 启动时设尺寸,断言 driver.get_window_size() 匹配。

浏览器启动配置面板

💡 提示:在 Selenium 中通过 Options() 对象统一管理所有启动参数,webdriver.Chrome(options=opts) 传入即可。

查看参考答案(Python Selenium)
# 练习 1 参考答案
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 1. 创建 Options 对象
opts = Options()

# ① 无头模式
opts.add_argument("--headless=new")

# ② 自定义 User-Agent
custom_ua = "Mozilla/5.0 (CustomAgent) SeleniumPractice/5.0"
opts.add_argument(f"--user-agent={custom_ua}")

# ③ 启动时窗口尺寸
opts.add_argument("--window-size=1280,720")

# 2. 启动浏览器(传入配置)
driver = webdriver.Chrome(options=opts)

# 3. 打开页面
driver.get("https://example.com")

# 4. 断言 UA
actual_ua = driver.execute_script('return navigator.userAgent')
assert "CustomAgent" in actual_ua, f"UA 不匹配: {actual_ua}"

# 5. 断言窗口尺寸
size = driver.get_window_size()
assert size["width"] == 1280 and size["height"] == 720, f"尺寸不匹配: {size}"

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

练习 2 · 打开 / 关闭页面(get / close / quit)

📋 练习要求 · 打开/关闭
概念 生命周期:启动 → 打开页面 → 断言加载 → close(仅关当前标签) / quit(全部退出)
Selenium API webdriver.Chrome / driver.get() / driver.close() / driver.quit() / driver.current_url
练习要点
  • driver.get("url") 打开目标页面,断言 driver.current_url 包含预期域名
  • driver.close() 仅关闭当前标签页;单标签场景下也会连带关掉整个浏览器进程
  • driver.quit() 关闭所有窗口并终止 WebDriver 会话(生产代码唯一正确的退出方式)
  • 多窗口场景用 window.open() 制造多标签,close 只关当前,quit 一次全退
# 快速参考
driver = webdriver.Chrome()
driver.get("https://example.com")
assert "example.com" in driver.current_url
driver.close()    # 关闭当前页
driver.quit()     # 全部退出
📋 本节练习清单
  • ✅ 练习目标 1:打开页面并断言 — webdriver.Chrome() 启动浏览器,driver.get("https://example.com") 打开页面,断言 current_url 包含 example.com
  • ✅ 练习目标 2:close 关闭当前窗口 — driver.close() 仅关闭当前标签页,配合 window.open() 多标签场景演示
  • ✅ 练习目标 3:quit 结束会话 — driver.quit() 关闭所有窗口并结束 WebDriver 会话,验证会话结束后再调用 driver API 会抛出异常
2 练习目标:打开页面 → 断言 → close 关闭 → quit 退出

操作步骤:
① 使用 webdriver.Chrome() 启动浏览器;
② driver.get("目标URL") 打开页面,断言 driver.current_url 包含预期域名;
③ driver.close() 关闭当前窗口;
④ driver.quit() 结束会话。

页面打开/关闭 模拟器
浏览器未启动...
查看参考答案(Python Selenium)
# 练习 2 参考答案
from selenium import webdriver
import selenium.common.exceptions as se_exc

# 启动浏览器
driver = webdriver.Chrome()

# ① 打开页面并断言
driver.get("https://example.com")
assert "example.com" in driver.current_url
print("✅ 页面打开成功:" + driver.current_url)

# ② close 关闭当前窗口(多标签场景演示)
# 用 JS 打开新标签页
driver.execute_script("window.open('https://autotest-505.pages.dev/','_blank')")

# 直接 close 当前标签(默认仍是第一个标签)
driver.close()
print("✅ driver.close() 执行成功")

# ③ quit 关闭全部并结束会话,验证 quit 后再调用会抛异常
driver.quit()
print("✅ quit 已执行,验证 quit 后再调用 driver API 会抛异常...")
quit_ok = False
try:
    driver.current_url  # 会话已结束,应抛异常
except se_exc.NoSuchWindowException:
    quit_ok = True
except se_exc.WebDriverException:
    quit_ok = True
print("✅ 练习 2 完成(quit 后异常已确认)")

练习 3 · 页面导航(get/back/forward/refresh)

📋 练习要求 · 页面导航
概念 浏览器维护导航历史栈,get 压栈、back/forward 在栈内移动指针
Selenium API driver.get / driver.back / driver.forward / driver.refresh / driver.title / driver.current_url
练习要点
  • driver.get(url) 后断言 driver.title 包含预期文案
  • 依次访问 A → B,再 back() 回 A、forward() 再到 B,每步断言 current_url
  • driver.refresh() 刷新当前页,断言页面可正常渲染(无异常)
# 快速参考
driver.get("https://example.com")
assert "Example" in driver.title
driver.get("https://selenium.dev")
driver.back()
assert "example.com" in driver.current_url
driver.forward()
driver.refresh()
📋 本节练习清单
  • ✅ 练习目标 1:get 打开并断言 title — driver.get() 打开本页,断言 title 包含「浏览器操作练习」、current_url 以 .html 结尾
  • ✅ 练习目标 2:back / forward 历史导航 — 依次点击进入子页面 A → B,driver.back() 回 A 并断言标题与 URL,driver.forward() 再到 B 并断言
  • ✅ 练习目标 3:refresh 刷新页面 — driver.refresh() 刷新当前页,断言刷新后 title、current_url 非空且页面正常渲染
3 练习目标:页面跳转、前进后退、刷新并断言 title / current_url

操作步骤:
① 使用 driver.get() 加载本页,断言 title 包含「浏览器操作练习」,current_url 以 .html 结尾。
② 通过模拟点击「子页面 A → 子页面 B」观察 URL 变化,再使用 back() 回退、forward() 前进,每步都断言地址栏与页面标题的显示值同步变化。
③ 最后使用 refresh() 刷新页面,断言「刷新次数」面板值每次增加(可调用多次验证)。

查看参考答案(Python Selenium)
# 练习 3 参考答案
import time
from selenium.webdriver.common.by import By

# 1. get 打开页面并断言 title / current_url
driver.get("file:///f:/autotest_project/browser_op_practice.html")
assert "浏览器操作练习" in driver.title
assert driver.current_url.endswith(".html")
print(f"title={driver.title}")
print(f"url={driver.current_url}")

# 2. 模拟点击:首页 -> 子页面 A -> 子页面 B(通过点击页面链接,真实场景下是 driver.get 新 URL)
links = driver.find_elements(By.CLASS_NAME, "nav-link")
# 先点第一个(子页面 A)
links[0].click()
time.sleep(0.5)
assert "个人中心" in driver.find_element(By.ID, "nav_title_text").text

# 当前页面上再点「前往 B」(需要重新获取链接)
driver.find_element(By.XPATH, "//span[contains(text(),'继续前往 子页面 B')]").click()
time.sleep(0.5)
assert "购物车" in driver.find_element(By.ID, "nav_title_text").text

# 3. back() 回退到 A
driver.back()
time.sleep(0.5)
# 使用面板断言(真实场景应使用 driver.title / current_url)
assert "个人中心" in driver.find_element(By.ID, "nav_title_text").text

# 4. forward() 前进到 B
driver.forward()
time.sleep(0.5)
assert "购物车" in driver.find_element(By.ID, "nav_title_text").text

# 5. refresh() 多次,断言刷新计数增加
before = int(driver.find_element(By.ID, "refresh_count").text)
driver.refresh()
# 注意:refresh() 会重载整个页面,面板值会清零;真实场景下刷新计数需要结合 URL 参数或 Cookie 保持
# 更稳妥的方式:用 driver.refresh() + title/current_url 非空断言
assert driver.title != ""
assert driver.current_url != ""

练习 4 · 窗口控制(大小/位置/全屏)

📋 练习要求 · 窗口控制
概念 控制浏览器窗口几何参数:状态、尺寸(宽×高)、屏幕坐标(x,y)
Selenium API maximize_window / minimize_window / fullscreen_window / set_window_size / set_window_position / get_window_size / get_window_position
练习要点
  • maximize_window() → fullscreen_window() → minimize_window(),观察状态切换
  • set_window_size(800, 600) + set_window_position(100, 100)
  • get_window_size() / get_window_position() 断言,允许 ±10px 误差
# 快速参考
driver.maximize_window()
driver.set_window_size(800, 600)
driver.set_window_position(100, 100)
size = driver.get_window_size()
assert abs(size["width"] - 800) <= 10
📋 本节练习清单
  • ✅ 练习目标 1:窗口状态切换 — maximize_window() 后断言面板「窗口状态」为 MAX;minimize_window() 后恢复窗口;fullscreen_window() 断言状态为 FUL
  • ✅ 练习目标 2:自定义窗口尺寸 — set_window_size(800, 600) 后用 get_window_size() 断言宽度、高度(允许 ±10px 误差)
  • ✅ 练习目标 3:窗口位置移动 — set_window_position(100, 100) 后用 get_window_position() 断言 x、y 坐标(允许 ±10px 误差)
4 练习目标:窗口最大化、最小化、全屏、自定义尺寸与位置移动

操作步骤:
① 使用 maximize_window() 将窗口最大化,然后断言面板中的「窗口状态」变为 MAX;再用 minimize_window() 最小化,恢复后再调 fullscreen_window() 进入全屏模式(状态应变为 FUL)。
② 使用 set_window_size(800, 600) 设置自定义尺寸,set_window_position(100, 100) 设置位置,再分别用 get_window_size() 和 get_window_position() 断言宽度、高度与 x、y 坐标是否匹配(允许 ±10px 误差)。

浏览器窗口信息面板
窗口状态 NOR
窗口宽度 -
窗口高度 -
窗口位置 X -
窗口位置 Y -
提示:真实测试时请使用 driver 的窗口 API,以上按钮仅用于面板演示。
查看参考答案(Python Selenium)
# 练习 4 参考答案
import time
from selenium.webdriver.common.by import By

# 1. 最大化窗口并断言面板状态
driver.maximize_window()
time.sleep(1)
status = driver.find_element(By.ID, "win_status").text
assert status == "MAX", f"期望 MAX,实际 {status}"

# 2. 最小化后恢复(演示用,Selenium 会最小化到任务栏)
driver.minimize_window()
time.sleep(1)
# 恢复:使用 set_window_size 重新显示
driver.set_window_size(1000, 700)
time.sleep(0.5)

# 3. 全屏模式
driver.fullscreen_window()
time.sleep(1)
# 面板状态需要手动同步(演示页面的 simulateWindow 函数)
driver.execute_script("simulateWindow('fullscreen')")
status = driver.find_element(By.ID, "win_status").text
assert status == "FUL", f"期望 FUL,实际 {status}"

# 4. 自定义尺寸 + 位置
driver.set_window_size(800, 600)
driver.set_window_position(100, 100)
time.sleep(0.5)

size = driver.get_window_size()
pos  = driver.get_window_position()
print(f"size={size}, position={pos}")

# 允许 ±10px 误差
assert abs(size["width"] - 800) <= 10
assert abs(size["height"] - 600) <= 10
assert abs(pos["x"] - 100) <= 10
assert abs(pos["y"] - 100) <= 10

练习 5 · 页面信息获取(title / current_url / source / session_id / capabilities)

📋 练习要求 · 页面信息
概念 从 WebDriver 实例和已加载页面中提取元信息(只读属性)
Selenium API driver.title / current_url / page_source / session_id / capabilities / name
练习要点
  • title、current_url、session_id 非空断言
  • page_source 包含 <html 或页面标题关键字
  • capabilities['browserName'] == 'chrome'
# 快速参考
driver.get("https://example.com")
assert "Example" in driver.title
assert "example.com" in driver.current_url
assert driver.session_id
assert "chrome" == driver.capabilities['browserName']
assert "<html" in driver.page_source.lower()
📋 本节练习清单
  • ✅ 练习目标 1:title / current_url — get() 后断言 driver.title 包含预期文案、driver.current_url 包含目标域名
  • ✅ 练习目标 2:session_id / capabilities — 断言 driver.session_id 非空,driver.capabilities['browserName'] 等于 chrome
  • ✅ 练习目标 3:page_source 页面源码 — 获取 driver.page_source,断言其中包含 <html 标签与页面标题关键字
5 练习目标:一次 get 后获取页面全部关键信息并断言

操作步骤:
① driver.get("目标URL") 后获取 driver.title 断言包含预期文案,driver.current_url 断言包含目标域名。
② 断言 driver.session_id 非空,driver.capabilities['browserName'] 等于 chrome。
③ 获取 driver.page_source 断言包含 <html 标签与页面标题关键字。

页面信息面板(mock 值)
driver.title
Example Domain
driver.current_url
https://example.com/
driver.session_id
abc123XYZ-9876543210fedcba
driver.capabilities['browserName']
chrome

💡 driver.page_source 返回完整 HTML 源码,通常包含 <html、<head、<body 等标签。

查看参考答案(Python Selenium)
# 练习 5 参考答案
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://example.com")

# ① 各种信息获取与断言
title = driver.title
assert title is not None and "Example" in title, f"title 不符合预期: {title}"

current_url = driver.current_url
assert "example.com" in current_url, f"url 不符合预期: {current_url}"

session_id = driver.session_id
assert session_id, "session_id 为空"

browser_name = driver.capabilities['browserName']
assert browser_name == "chrome", f"browserName 不符合预期: {browser_name}"

# ② page_source 断言
source = driver.page_source
assert "<html" in source.lower(), "page_source 不包含 <html"
assert "Example Domain" in source, "page_source 不包含标题文本"

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

练习 6 · 元素交互(click / send_keys / clear / is_displayed / get_text)

📋 练习要求 · 元素交互
概念 WebElement 三件套:clear → send_keys → click,操作前先断言可见
Selenium API find_element / click / send_keys / clear / is_displayed / get_attribute / text
练习要点
  • find_element 定位输入框 → clear() 清空 → send_keys("test_user")
  • is_displayed() 断言元素可见,再 click() 触发按钮
  • 断言按钮 disabled 属性为真,或页面出现 "登录成功" 文本
# 快速参考
username = driver.find_element(By.ID, "username")
username.clear()
username.send_keys("test_user")
assert username.is_displayed()
login_btn = driver.find_element(By.ID, "login_btn")
login_btn.click()
assert "登录成功" in driver.page_source
📋 本节练习清单
  • ✅ 练习目标 1:输入框填写 — find_element(By.ID, "username") 定位输入框,clear() 清空后 send_keys("test_user") 输入内容
  • ✅ 练习目标 2:可见性断言 — 操作前用 is_displayed() 断言输入框可见,避免对隐藏元素误操作
  • ✅ 练习目标 3:点击与结果断言 — click() 点击 #login_btn 按钮,断言按钮 disabled 属性变为 true、页面出现「登录成功」文本
6 练习目标:表单填写 + 按钮点击 + 文本断言

操作步骤:
① 用 driver.find_element(By.ID, "username") 找到输入框,clear() 后 send_keys("test_user");
② 用 is_displayed() 断言输入框可见;
③ 点击 #login_btn 按钮;
④ 断言页面中出现预期的提示文本(如"登录成功"或按钮的 disabled 属性变 true)。

迷你表单模拟(练习元素交互)
查看参考答案(Python Selenium)
# 练习 6 参考答案
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
# 请替换为包含上述迷你表单的测试页面 URL
driver.get("https://你的测试页面URL")

# ① 定位 + 操作前先断言可见
username_input = driver.find_element(By.ID, "username")
assert username_input.is_displayed(), "username 输入框不可见"

# ② 清空 + 输入
username_input.clear()
username_input.send_keys("test_user")

# ③ 点击登录按钮
login_btn = driver.find_element(By.ID, "login_btn")
login_btn.click()

# ④ 断言结果(按钮 disabled 属性变 true 或提示文本)
assert login_btn.get_attribute("disabled") == "true", "登录按钮未被禁用"
page_text = driver.page_source
assert "登录成功" in page_text, "页面未出现「登录成功」"

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

练习 8 · 截图保存

📋 练习要求 · 截图
概念 整页截图保存到本地文件 + 元素级截图(Selenium 4.x)
Selenium API save_screenshot / get_screenshot_as_base64 / base64.b64decode / os.path.exists / WebElement.screenshot
练习要点
  • driver.save_screenshot("shot.png") 返回 True,用 os.path.exists() 验证文件生成
  • driver.get_screenshot_as_base64() 返回 base64 字符串,b64decode 后写入文件
  • 进阶:driver.find_element(By.ID, "xxx").screenshot("ele.png") 单独截取某个元素(Selenium 4.0+ 新增)
# 快速参考
import os, base64
ok = driver.save_screenshot("./shot.png")
assert ok and os.path.exists("./shot.png")
b64 = driver.get_screenshot_as_base64()
with open("./shot_b64.png", "wb") as f:
    f.write(base64.b64decode(b64))
# Selenium 4.0+ 进阶:元素级截图
driver.find_element(By.ID, "shot_target_card").screenshot("./shot_ele.png")
📋 本节练习清单
  • ✅ 练习目标 1:整页截图与文件验证 — save_screenshot("shot.png") 保存整张页面,断言返回值为 True,用 os.path.exists() 验证文件已生成,os.path.getsize() 断言大小 > 0,扩展名为 .png
  • ✅ 练习目标 2:Base64 截图保存 — 用 get_screenshot_as_base64() 获取 base64 编码,base64.b64decode() 解码后写入 .png 文件
  • ✅ 练习目标 3(进阶):元素级截图 — 定位 #shot_target_card 卡片后调用元素级 .screenshot("./shot_ele.png") 单独截取该元素(Selenium 4.0+ 新增 API)
8 练习目标:save_screenshot 整页截图与文件验证 + Base64 保存 + 元素级截图

操作步骤:
① 使用 driver.save_screenshot("shot.png") 保存整张页面截图,断言返回值为 True,用 os.path.exists() 验证文件存在,os.path.getsize() 断言大小 > 0,扩展名为 .png。
② 使用 driver.get_screenshot_as_base64() 获取 base64 编码字符串,用 base64.b64decode() 解码后以二进制写入 shot_b64.png,断言文件已生成且大小 > 0。
③ 进阶:定位页面上的某个元素(如下方的「截图目标卡片」#shot_target_card),使用 element.screenshot("ele.png") 单独截取该元素(Selenium 4.0+ 新增 API)。

🎯 截图目标卡片(Target Card) ID: card_2026_Q3
用户 ID
UID-778899
订单编号
ORD-20260822-001
练习关卡
Level-4 / 截图

截图预览区 — 使用 Selenium save_screenshot() 即可将整张页面保存为 PNG
真实代码示例:driver.save_screenshot("./shots/ex4.png")

查看参考答案(Python Selenium)
# 练习 8 参考答案
import os
from selenium.webdriver.common.by import By

# 确保已打开页面
if "浏览器操作练习" not in driver.title:
    driver.get("file:///f:/autotest_project/browser_op_practice.html")

# 1. save_screenshot 截图整张页面并验证文件
shot_path = "./shot.png"
ok = driver.save_screenshot(shot_path)
print(f"save_screenshot 返回值:{ok}")
assert ok is True
assert os.path.exists(shot_path), f"截图文件不存在: {shot_path}"
assert os.path.getsize(shot_path) > 0, "截图文件大小为 0"
assert shot_path.endswith(".png"), "截图文件扩展名应为 .png"
print(f"截图已保存且验证通过,文件大小:{os.path.getsize(shot_path)} bytes")

# 2. get_screenshot_as_base64 获取 base64 并保存为文件
import base64
b64_str = driver.get_screenshot_as_base64()
assert len(b64_str) > 0, "base64 字符串为空"
b64_path = "./shot_b64.png"
with open(b64_path, "wb") as f:
    f.write(base64.b64decode(b64_str))
assert os.path.exists(b64_path), f"base64 截图文件不存在: {b64_path}"
assert os.path.getsize(b64_path) > 0, "base64 截图文件大小为 0"
print(f"base64 截图已保存:{b64_path},大小:{os.path.getsize(b64_path)} bytes")

# 3. 进阶:Selenium 4.0+ 元素级截图
card = driver.find_element(By.ID, "shot_target_card")
card.screenshot("./shot_ele.png")
assert os.path.exists("./shot_ele.png") and os.path.getsize("./shot_ele.png") > 0
print("✅ 元素级截图成功:shot_ele.png")

print("✅ 练习 8 所有断言通过!")

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

📋 练习要求 · 超时与等待
概念 三种等待机制:隐式全局、显式按需(推荐)、页面加载超时 — 不要混用隐式 + 显式
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)
(等待中...)
三种等待机制对比
隐式等待(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 所有断言通过!")

关于我们

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. 如涉及版权问题或内容建议,请及时通过联系方式与我们沟通,我们将第一时间处理。