首页/开发/软件测试速查/Selenium WebDriver 基础
自动化测试66 条

Selenium WebDriver 基础

Selenium WebDriver 通过 W3C WebDriver 协议驱动真实浏览器:创建 driver、打开页面、定位元素、执行动作与断言;语言绑定覆盖 Java、Python、C#、JavaScript 等。

软件测试速查开发更新于 2026-10-13

Selenium WebDriver 是什么

Selenium WebDriver 是通过 W3C WebDriver 协议驱动真实浏览器的自动化测试工具:脚本把「打开页面、定位元素、执行动作、读取状态」翻译成协议命令,由浏览器驱动进程在本地执行,或经由 Selenium Grid 转发到远程机器与云厂商浏览器节点。语言绑定覆盖 Java、Python、C#、JavaScript 等,适合存量团队在已有技术栈内搭建 UI 自动化。

基本信息

驱动协议W3C WebDriver(浏览器厂商提供驱动或原生支持)
语言绑定Java、Python、C#、JavaScript、Ruby 等
驱动管理Selenium Manager(4.6 起内置)自动下载匹配的浏览器驱动
等待机制显式等待 WebDriverWait 条件轮询,优于固定 sleep
运行形态本地直连、Selenium Grid 分布式、云厂商浏览器集群
退出约定driver.quit() 关闭浏览器并回收驱动进程

典型使用场景

  • 存量体系维护:团队已用 Java 或 Python 技术栈,沿用 Selenium 生态最省迁移成本。
  • 跨浏览器矩阵:用 Grid 把同一套用例分发到 Chrome、Firefox、Edge 等真实浏览器执行。
  • 企业内网环境:被测系统只在内网可达时,本地或内网 Grid 部署更贴合现实。
  • 关键流程回归:把下单、审批等高频业务路径固化为每日回归套件。
  • 与传统测试框架配合:JUnit、TestNG、pytest 里管理用例与报告,Selenium 只管浏览器操作。
  • 渐进式自动化:从录制或半手工脚本起步,先跑通再逐步工程化。

Python 最小示例

Python 最小示例
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()          # 由 Selenium Manager 准备驱动
wait = WebDriverWait(driver, 10)     # 显式等待:最多轮询 10 秒
try:
    driver.get("https://example.com/login")
    wait.until(EC.visibility_of_element_located((By.ID, "user"))).send_keys("alice")
    driver.find_element(By.ID, "submit").click()
finally:
    driver.quit()                    # 无论成败都退出,避免残留进程

等待方式对照

方式机制使用建议
显式等待对指定条件轮询直到成立或超时首选:条件明确、等待范围可控
隐式等待全局设置一次,作用于每次查找元素少用:与显式等待混用会放大等待时长
固定 sleep无条件阻塞指定时间尽量不用:机器快慢都会失真
定位优先级:id、name、可访问名称等稳定属性最优先,其次 CSS 选择器,最后才是 XPath;绝对路径 XPath 一改结构就失效,应避免。
无头模式适合 CI 执行:Chrome 与 Firefox 均支持 headless 启动,但截图与调试体验会变差,本地排查时切回有头模式更快。
驱动与浏览器版本链条由 Selenium Manager 处理,但内网无外网时需预置驱动或使用镜像,否则首次启动会直接失败。
Grid 共享环境要保证用例数据隔离:不同节点同时操作同一账号或同一订单,会互相踩数据造成随机失败。

易错点

  • driver 未在 finally 或上下文管理器中退出:CI 上残留浏览器与驱动进程,久而久之资源被耗尽。
  • 元素定位依赖窗口尺寸与滚动位置:换分辨率或弹层遮挡后批量失效,应改用稳定属性并显式等待可点击。
  • 隐式等待与显式等待混用:总等待时间被层层放大,失败用例越跑越慢且难以解释。
  • 用 sleep 替代条件等待:快环境空转、慢环境假失败,套件整体时间不可控。
  • 把验证逻辑塞进页面对象之外散落各处:断言口径不统一,改一处页面结构要翻遍所有用例。

数据来源与参考

  • Selenium 官方文档(selenium.dev)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌