- 首页
- /
- Selenium vs Puppeteer
Selenium vs Puppeteer
Selenium 和 Puppeteer 解决的是不同的问题:一个是跨浏览器的 W3C WebDriver 标准,另一个是专注于 Chrome 的快速自动化库。本指南将从协议、语言、浏览器覆盖范围、速度和使用场景等方面对它们进行全面比较,并提供代码示例和结论,让您在五分钟内即可付诸行动。
- 浏览器和设备
- 6100+
- 云并行
- 100×
- 正常运行时间服务级别协议
- 99.99%
被世界上一些最具创新性的公司所信任
你应该选哪一个?
您需要在 Chrome、Firefox、Safari、Edge 和 Internet Explorer 上进行真正的跨浏览器测试,需要支持多种语言,或者需要通过 Appium 使用真实移动设备,并且全部基于 W3C 标准协议。
您使用 Node.js 自动化 Chrome 或 Chromium,以实现快速的端到端测试、抓取、PDF 生成或性能跟踪,并且您不需要 Safari、Internet Explorer 或其他语言。
您使用 Puppeteer 进行快速的仅 Chrome 检查,并使用 Selenium 实现广泛的跨浏览器覆盖。TestingBot 可以在同一个网格上、并行地、在一个仪表板中运行两者。
Selenium 和 Puppeteer 是什么?
两种目标不同的浏览器自动化工具。一个标准化跨浏览器控制,另一个高速驱动 Chrome。
Selenium
发布于 2004 年 · 开源 · Apache 2.0
Selenium 是最初的浏览器自动化框架,也是 W3C WebDriver 标准的基础。Selenium WebDriver 通过供应商提供的驱动程序(chromedriver、geckodriver、safaridriver、edgedriver)使用相同的网络协议从外部驱动任何浏览器。
二十年的生态系统成熟意味着它为每一种主流语言提供绑定、拥有深度 IDE 集成、成熟的 Page Object 模式,以及通过 Appium 进行的真实移动设备测试,而 Appium 正是构建在同一协议之上的。
- Java / Python / C# / Ruby / JavaScript / Kotlin
- W3C WebDriver 标准,适用于所有浏览器
- Chrome、Firefox、Safari、Edge、IE 11 · 通过 Appium 支持真实移动设备
Puppeteer
发布于 2017 年 · Google · Apache 2.0
Puppeteer 是 Google Chrome 团队开发的 Node.js 库,它通过 Chrome DevTools 协议控制 Chrome、Chromium 和 Edge。它为快速的端到端测试、网页抓取、PDF 生成和性能跟踪提供支持。
由于它直接使用 DevTools 协议而非 WebDriver,Puppeteer 速度很快,并且对网络、控制台和跟踪拥有一流的访问能力。同样的设计也将它绑定到了基于 Chromium 的浏览器和 JavaScript 生态系统。
- JavaScript 和 TypeScript(Node.js)
- Chrome DevTools 协议,网络和跟踪访问
- Chrome、Chromium、Edge · Firefox 为实验性,不支持 Safari/IE
Selenium 与 Puppeteer:并排比较
在 CI 中选择、迁移或同时运行两者时需要考虑的各个重要维度。
| 方面 |
|
|
|---|---|---|
| First release | 2004 | 2017 |
| Maintained by | Open-source community + W3C | Google (Chrome team) |
| Protocol | W3C WebDriver | Chrome DevTools Protocol |
| Languages | Java, Python, C#, Ruby, JS, Kotlin | JavaScript / TypeScript |
| Browsers | Chrome, Firefox, Safari, Edge, IE 11 | Chrome, Chromium, Edge |
| Firefox / Safari | Both supported | Firefox experimental, no Safari |
| Mobile testing | Real iOS + Android via Appium | None |
| Speed | Mature, predictable | Faster on Chrome (direct CDP) |
| Network interception | BiDi (Selenium 4) or proxy | First-class (CDP) |
| Scraping / PDF / tracing | Possible | First-class |
| Test runner | Bring your own (JUnit, pytest) | Bring your own (Jest, Mocha) |
| Standard | W3C WebDriver standard | Chrome-specific protocol |
| Parallel execution | Selenium Grid | Worker-based (Jest, Mocha) |
| Ecosystem maturity | 20 years of integrations | Strong since 2017 |
| Free for open source on TestingBot | ✓ | ✓ |
功能说明反映了截至 2026 年的 Selenium 4.x 和 Puppeteer 23.x。这两个框架均运行在 TestingBot 的云端,Selenium 通过 WebDriver hub 运行,Puppeteer 通过 browserWSEndpoint 连接运行。
登录并断言结果
使用显式等待(Selenium)和 DevTools 协议会话(Puppeteer)的登录流程。两者均在同一个 TestingBot 测试网格上运行。
# Driver points at TestingBot remote URL 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 def test_login_redirects_to_dashboard(driver): driver.get('https://app.example.com/login') driver.find_element(By.NAME, 'username').send_keys('jane@example.com') driver.find_element(By.NAME, 'password').send_keys('••••••••') driver.find_element(By.CSS_SELECTOR, 'button[type=submit]').click() # explicit wait WebDriverWait(driver, 10).until(EC.url_contains('/dashboard')) welcome = driver.find_element(By.TAG_NAME, 'h1') assert 'Welcome, Jane' in welcome.text
// connect to TestingBot over the DevTools protocol import puppeteer from 'puppeteer-core'; const caps = { key: 'KEY', secret: 'SECRET', browserName: 'chrome', browserVersion: 'latest' }; const browser = await puppeteer.connect({ browserWSEndpoint: `wss://cloud.testingbot.com/puppeteer?capabilities=${encodeURIComponent(JSON.stringify(caps))}`, }); const page = await browser.newPage(); await page.goto('https://app.example.com/login'); await page.type('#username', 'jane@example.com'); await page.type('#password', '••••••••'); await page.click('button[type=submit]'); await page.waitForSelector('h1');
Selenium 测试连接到 WebDriver hub;Puppeteer 脚本通过 browserWSEndpoint 连接。两者都显示在同一个 TestingBot 仪表板中。
何时选择哪个
选择 Selenium 时
- 您需要真正的跨浏览器覆盖,包括 Safari、Internet Explorer 11 和 Edge,而不仅仅是 Chromium。
- 您的团队使用 Java、C#、Ruby 或 Python 编写代码,并且希望获得完整的客户端库一致性。
- 您测试真实的 iOS 和 Android 设备,而 Appium 复用了相同的 WebDriver 协议。
- 您希望使用与厂商无关的 W3C 标准协议,而不是特定于 Chrome 的协议。
- 您拥有成熟的 Page Object 库或 BDD 框架(Cucumber、SpecFlow),不想重写它们。
选择 Puppeteer 时
- 您只需要自动化 Chrome、Chromium 或 Edge,并希望获得尽可能快的运行速度。
- 您的团队以 Node.js 为先,并且希望使用 JavaScript 或 TypeScript API。
- 您在测试的同时还要进行网页抓取、PDF 生成、截图或性能跟踪。
- 您希望直接通过 DevTools 协议访问网络、控制台和 CDP 事件。
- 您不需要 Safari、Internet Explorer、真实移动设备或非 JavaScript 语言。
停止选择,在同一网格上运行两者
将 Selenium 指向 WebDriver hub,并通过 browserWSEndpoint 连接 Puppeteer。您的测试将共享相同的 6100+ 浏览器和设备、相同的仪表板、相同的并行槽位和相同的欧盟数据驻留。
- 相同的身份验证、相同的项目、相同的计费方式
- 两个工具的并排测试历史记录
- 免费开源,这两个工具都是如此
command_executor='https://hub.testingbot.com/wd/hub'
)
browserWSEndpoint:
'wss://cloud.testingbot.com/puppeteer'
})
常见问题解答
团队在选择(或组合)这些工具之前会提出的问题。
Puppeteer 比 Selenium 快吗?
通常是的,在 Chrome 上如此。Puppeteer 直接使用 Chrome DevTools 协议,避免了 WebDriver 协议的 HTTP 往返,因此仅 Chrome 的测试套件运行速度往往更快。但这种优势仅适用于基于 Chromium 的浏览器,并且一旦测试受网络限制,优势就会缩小。Selenium 4 的 BiDi 支持也缩小了这一差距。速度优势确实存在,但相对于 Selenium 的跨浏览器覆盖范围,它很少成为决定性因素。
Puppeteer 可以取代 Selenium 吗?
仅适用于专注于 Chrome 的工作。Puppeteer 非常适合使用 Node.js 自动化 Chrome、Chromium 和 Edge,但它无法驱动 Safari 或 Internet Explorer,不支持真实移动设备,并且仅支持 JavaScript。如果您需要跨浏览器测试、多种语言或真实设备,Selenium 仍然是更广泛的工具。许多团队使用 Puppeteer 进行快速的 Chrome 检查,并使用 Selenium 实现完整的跨浏览器覆盖。
Puppeteer 是否支持 Chrome 以外的浏览器?
Puppeteer 可以驱动 Chrome、Chromium 和基于 Chromium 的 Edge,并提供实验性的 Firefox 支持。它无法驱动 Safari 或 Internet Explorer。Selenium 通过供应商提供的驱动程序驱动每一种主流浏览器的实际二进制文件,包括 Safari 和 Internet Explorer 11。如果您需要 Chromium 以外的任何浏览器,那么在两者之中 Selenium 是您的选择。TestingBot 可在其浏览器网格上运行两者。
Puppeteer 可以测试移动应用吗?
不可以。Puppeteer 在 Chromium 中提供移动视口模拟功能,但它无法驱动原生 iOS 或 Android 应用。要进行真正的移动测试,您需要 Appium、XCUITest、Espresso 或 Maestro。Appium 复用了 Selenium 所构建于其上的 WebDriver 协议。TestingBot 可在真实的 iOS 和 Android 设备上运行所有这些工具。
Puppeteer 和 Selenium 哪个更适合网页抓取?
得益于其对 DevTools 的直接访问能力和 Node.js 生态系统,Puppeteer 是网页抓取、PDF 生成和无头 Chrome 自动化更常见的选择。Selenium 也可以进行抓取,但它的强项是跨多种语言的跨浏览器测试自动化。请选择与任务相匹配的工具:Puppeteer 用于 Chrome 自动化任务,Selenium 用于基于标准的跨浏览器测试。
我可以在 TestingBot 上并行运行 Puppeteer 吗?
可以。Puppeteer 基于 worker 的并行化(通过 Jest、Mocha 或自定义运行器)可在 TestingBot 网格上运行:每个 worker 通过 WebSocket 端点打开自己的远程浏览器。并发数受您的计划限制。Selenium 通过 WebDriver hub 以相同的方式进行并行化。
我可以在 TestingBot 上运行 Selenium 和 Puppeteer 吗?
是的,两者都运行在同一个 TestingBot 云平台上。Selenium 通过 webdriver.Remote 连接到 https://hub.testingbot.com/wd/hub。Puppeteer 使用 wss://cloud.testingbot.com/puppeteer 的 browserWSEndpoint 通过 puppeteer.connect 连接。两者的测试都显示在同一个仪表板中,共享并行槽位,并受益于相同的欧盟数据驻留、视频录制和 CI/CD 集成。两者都对开源项目免费开放。