我错了:Selenium vs Playwright 在2025年

发布: (2026年1月31日 GMT+8 16:19)
8 min read
原文: Dev.to

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 会自动等待元素可见、可用,并且等待动画完成。
  • 几乎不需要使用固定等待。
  • 好处:
    • 缩短测试执行时间。
    • 减少不稳定的测试。
    • 降低维护成本。

快速比较

方面SeleniumPlaywright
定位浏览器自动化库测试框架
测试执行需要单独的框架(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

Back to Blog

相关文章

阅读更多 »