常见问题解答
问:谁维护 Puppeteer?
Chrome 浏览器自动化团队维护该库,但我们非常欢迎您为该项目提供帮助和专业知识!请参阅我们的贡献指南。
问:跨浏览器支持的状态是什么?
官方 Firefox 支持目前处于实验阶段。与 Mozilla 的持续合作旨在支持常见的端到端测试用例,开发人员希望这些用例涵盖跨浏览器。Puppeteer 团队需要用户的意见来稳定 Firefox 支持并向我们提出缺少的 API。
从 Puppeteer v2.1.0 开始,您可以指定 puppeteer.launch({product: 'firefox'})
在 Firefox Nightly 中运行您的 Puppeteer 脚本,无需任何其他自定义补丁。虽然 较旧的实验 需要一个已修补的 Firefox 版本,但 当前方法 可与“库存”Firefox 配合使用。
我们将继续与其他浏览器供应商合作,为 Safari 等浏览器提供 Puppeteer 支持。这项工作包括探索跨浏览器命令的执行标准(而不是依赖 Chrome 使用的非标准 DevTools 协议)。
2023-11-17 更新:Puppeteer 对新的 WebDriverBiDi 协议提供实验性支持,该协议可用于自动化 Firefox。Firefox 中的 WebDriver BiDi 实现将来将取代 Firefox 中当前的 CDP 实现。有关更多详细信息,请参阅 https://puppeteer.com.cn/webdriver-bidi。
问:Puppeteer 是否支持 WebDriver BiDi?
Puppeteer 对 WebDriver BiDi 提供实验性支持。请参阅 https://puppeteer.com.cn/webdriver-bidi。
问:Puppeteer 的目标和原则是?
该项目的目标是
- 提供一个参考实现,突出显示 Chrome DevTools 和 WebDriver BiDi 协议的功能。
- 扩大跨浏览器自动化测试的采用。
- 帮助推广新的 DevTools 协议和 WebDriver BiDi 功能...并捕获错误!
- 更多地了解自动化浏览器测试的痛点,并帮助填补这些空白。
我们采用 Chromium 原则 来帮助我们推动产品决策
- 速度:Puppeteer 对自动化页面几乎没有性能开销。
- 安全性:Puppeteer 在浏览器之外运行,因此可以安全地自动化潜在的恶意页面。
- 稳定性:Puppeteer 不应该不稳定,也不应该泄露内存。
- 简单性:Puppeteer 提供了一个高级 API,易于使用、理解和调试。
问:Puppeteer 是否是 Selenium WebDriver 的替代品?
否。这两个项目因截然不同的原因而很有价值
- Selenium WebDriver 专注于跨浏览器自动化,并为多种语言提供绑定;Puppeteer 仅适用于 JavaScript。
- Puppeteer 专注于 Chromium;其价值主张是为基于 Chromium 的浏览器提供更丰富的功能。
也就是说,你可以使用 Puppeteer 对 Chromium 运行测试,例如使用社区驱动的 jest-puppeteer 或 Puppeteer 的 Angular 集成。虽然这可能不应该成为你唯一的测试解决方案,但与经典的 WebDriver 相比,它确实有一些优点
- Puppeteer 无需任何设置,并捆绑了与其配合得最好的 Chrome 版本,使其非常容易上手。
- Puppeteer 具有事件驱动的架构,消除了很多潜在的不稳定性。在 puppeteer 脚本中不需要“sleep(1000)”调用。
- Puppeteer 公开了浏览器上下文,从而可以有效地并行执行测试。
- Puppeteer 在调试方面表现出色:将“headless”位翻转为 false,添加“slowMo”,你将看到浏览器正在做什么。你甚至可以打开 Chrome DevTools 来检查测试环境。
问:为什么 Puppeteer v.XXX 不适用于 Chromium v.YYY?
我们将 Puppeteer 视为与 Chromium不可分割的实体。每个版本的 Puppeteer 都捆绑了一个特定的 Chromium 版本——唯一保证与其配合使用的版本。
这不是一个人为的限制:Puppeteer 的很多工作实际上都是在 Chromium 存储库中进行的。这是一个典型的故事
- 报告了一个 Puppeteer bug:https://github.com/puppeteer/puppeteer/issues/2709
- 事实证明这是一个 DevTools 协议的问题,因此我们在 Chromium 中修复了它:https://chromium-review.googlesource.com/c/chromium/src/+/1102154
- 上游修复完成后,我们将更新的 Chromium 滚动到 Puppeteer:https://github.com/puppeteer/puppeteer/pull/2769
问:Puppeteer 使用哪个 Chrome 版本?
在 revisions.ts 中查找 chrome
条目。
问:Puppeteer 使用哪个 Firefox 版本?
由于 Firefox 支持处于实验阶段,因此当 PUPPETEER_PRODUCT
环境变量设置为 firefox
时,Puppeteer 会下载最新的 Firefox Nightly。这也是 revisions.ts 中 firefox
的值为 latest
的原因——Puppeteer 并未绑定到特定的 Firefox 版本。
在 Puppeteer 安装过程中获取 Firefox Nightly
PUPPETEER_PRODUCT=firefox npm i puppeteer
将 Firefox Nightly 下载到现有的 Puppeteer 项目中
npx puppeteer browsers install firefox
问:什么是“导航”?
从 Puppeteer 的角度来看,“导航”是任何更改页面 URL 的操作。除了浏览器访问网络以从 Web 服务器获取新文档的常规导航之外,还包括 锚点导航 和 历史记录 API 的使用。
有了这个“导航”的定义,Puppeteer 可以与单页面应用程序无缝协作。
问:什么是“受信任”和“不受信任”的输入事件之间的区别?
在浏览器中,输入事件可以分为两大类:受信任与不受信任。
- 可信事件:用户与页面交互时产生的事件,例如使用鼠标或键盘。
- 不可信事件:Web API 产生的事件,例如
document.createEvent
或element.click()
方法。
网站可以通过以下方式区分这两组事件
- 使用
Event.isTrusted
事件标志 - 嗅探伴随事件。例如,每个可信的
'click'
事件之前都有'mousedown'
和'mouseup'
事件。
出于自动化目的,生成可信事件非常重要。Puppeteer 生成的所有输入事件都是可信的,并且会触发适当的伴随事件。如果出于某种原因需要不可信事件,则始终可以使用 page.evaluate
进入页面上下文并生成一个虚假事件
await page.evaluate(() => {
document.querySelector('button[type=submit]').click();
});
问:Puppeteer 是否支持媒体和音频播放?
Puppeteer 默认使用 Chrome for Testing 二进制文件,该文件从 M120 开始支持专有编解码器。
问:我在测试环境中安装/运行 Puppeteer 时遇到问题。我应该在哪里寻求帮助?
我们针对各种操作系统提供 故障排除 指南,其中列出了所需依赖项。
问:我还有更多问题!我该去哪里提问?
有许多方法可以获得有关 Puppeteer 的帮助
- 如有疑问:Stack Overflow
- 如需报告错误:GitHub 问题
在发布问题之前,请务必搜索这些渠道。