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 共享环境要保证用例数据隔离:不同节点同时操作同一账号或同一订单,会互相踩数据造成随机失败。