我错了:Selenium vs Playwright 在2025年
Source: Dev.to
当我回顾2025并展望2026时,我想分享一个得到的教训。
在过去的一年里,我没有参与任何使用 Selenium 构建新自动化测试的项目。每次讨论都围绕使用 SaaS 平台工具或使用 Playwright 来构建。那些过去会出现的 Selenium 项目——现在我只是安静地维护和更新最初用 Selenium 构建的自动化测试系统。
如果今天有人问我,“我们要开始网页测试自动化,你可以随意决定——我们应该选择哪种测试工具或框架?” 我会回答 Playwright 是更好的选择。
一年前,我会说,“没关系,它们都一样。” 现在回想,我必须承认那完全是错误的。我当时判断失误。
我认为这是我因太忙而没有好好探索新工具而付出的代价。最近,我有更多机会使用 Playwright(多亏了 AI),所以想分享一下我的观察。
为什么会有转变?
在转向 Playwright 的背后,是测试自动化领域的一次变革。
-
过去,我经常收到需要检测浏览器之间差异的测试请求:
“请确认在 Chrome、Firefox、Edge 和 Internet Explorer 上的表现一致。” -
现在这类请求已经很少见了。
影响最大的因素是 Internet Explorer 的终结(我知道,这已经是很久以前的事了!)。IE 有自己的渲染引擎,与其他浏览器的兼容性问题层出不穷。IE 消失后,主流浏览器已经归为以下几类:
- 基于 Chromium 的(Chrome、Edge)
- Firefox
- Safari
这大大减少了跨浏览器的差异。Selenium 的最大优势在于能够统一控制多种浏览器,但这种优势发挥作用的场景已经大幅减少。
拥有超过 20 年的测试自动化经验,我发现自己在 Selenium 中感受到的挑战正被 Playwright 所解决。
Selenium 世界
定位器
// Typical locator strategy in Selenium
driver.findElement(By.id("submit-button"));
driver.findElement(By.cssSelector("#form > div.container > button.primary"));
driver.findElement(By.xpath("//div[@class='modal']//button[contains(text(), 'Submit')]"));
- 我们必须考虑选择器层级——先 ID,然后 name,CSS,最后 XPath。
- 每次 DOM 结构变化,选择器都需要更新。
- 因为开发者重命名了类而导致测试失败并不罕见。
等待处理
// Explicit wait in Selenium
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(
ExpectedConditions.elementToBeClickable(By.id("submit-button"))
);
// The common “just wait” anti‑pattern
Thread.sleep(3000); // Fixed 3‑second wait
- 设置合适的等待条件很困难,所以我们经常退回到固定等待。
- 后果:
- 执行时间不必要地长。
- 在某些环境下出现不稳定的测试。
- 整体执行时间膨胀。
我们一直在 稳定性 与 速度 之间的权衡中苦苦挣扎。
Playwright 世界
基于角色的选择器
// Role‑based selectors in Playwright
await page.getByRole('button', { name: 'Submit' }).click();
await page.getByLabel('Email Address').fill('test@example.com');
await page.getByPlaceholder('Enter search keyword').fill('Playwright');
- 元素是通过用户感知的角色和名称来识别的,而不是依据 DOM 结构。
- 只要按钮的名称是 “Submit”,即使 HTML 发生变化,测试仍然能够正常运行。
- 这符合可访问性原则;屏幕阅读器使用相同的角色和 ARIA 标签。
- 在 AI 时代,这一点更加重要:AI 驱动的自动化(例如 Playwright MCP)正从 DOM 转向 可访问性树(ARIA Snapshot)。熟悉基于角色的选择器是对未来的投资。
自动等待
// Wait handling is automatic in Playwright
await page.getByRole('button', { name: 'Submit' }).click(); // ← auto‑waits until clickable
- Playwright 会自动等待元素可见、可用,并且等待动画完成。
- 几乎不需要使用固定等待。
- 好处:
- 缩短测试执行时间。
- 减少不稳定的测试。
- 降低维护成本。
快速比较
| 方面 | Selenium | Playwright |
|---|---|---|
| 定位 | 浏览器自动化库 | 测试框架 |
| 测试执行 | 需要单独的框架(JUnit,TestNG) | Playwright Test 内置 (*) |
| 选择器 | 基于 DOM / CSS / XPath | 推荐使用基于角色的 |
| 等待处理 | 需要显式等待 | 自动等待(标准) |
| 截图 | 需要单独实现 | 只需配置 |
| 视频录制 | 需要单独实现 | 只需配置 |
| 追踪 | 无 | 包含 Trace Viewer |
| 并行执行 | 设置复杂 | 标准支持 |
| 浏览器管理 | 手动管理 WebDriver(真实浏览器) | 自动(专用浏览器) |
| 重试功能 | 自行实现 | 标准支持 |
* Playwright Test 仅适用于 TypeScript/JavaScript。Java 版本需要使用像 JUnit 这样的单独框架。
最后思考
关于浏览器管理,Selenium 确实有其优势。Selenium 会启动 安装在您电脑上的实际浏览器,因此您可以在与用户相同的环境中进行测试。而 Playwright 则会自动下载并使用 专用的浏览器二进制文件。
Source: …
从 Selenium 到 Playwright
“更容易设置,但严格来说,并不是‘与你的用户使用的完全相同的浏览器’。”
正如表格所示,Selenium 是 “一种浏览器自动化机制”,在测试方面它 需要单独的测试框架。这意味着需要掌握各种外围知识——JUnit、TestNG、等待处理最佳实践、报告工具等等。
而 Playwright 本身就是一个测试框架。它自带针对测试的功能,只需通过配置即可捕获截图和视频,真的非常方便。
Selenium 是开创网页浏览器自动化的优秀工具,我个人也使用了多年。
然而,测试自动化的格局正在变化:
- 浏览器差异已减小,相对降低了跨浏览器测试的重要性。
- 基于角色的选择器 能够让测试更稳健。
- 自动等待 让我们摆脱不可靠的测试和浪费的等待时间。
- 最重要的是,Playwright 被设计为“测试自动化平台”,而不仅仅是“浏览器自动化工具”。
对于刚开始进行网页测试自动化的人员,或是考虑从 Selenium 迁移的团队,我强烈推荐 Playwright。
本文是 Playwright 系列的 第 1 部分
| 部分 | 标题 |
|---|---|
| 第 1 部分 | 从 Selenium 到 Playwright(本文) |
| 第 2 部分 | TypeScript vs Java – 按语言的特性差异 |
| 第 3 部分 | BDD 框架对比 – Cucumber.js vs Playwright‑bdd |
最初发布于 Arrangility.com。