实验性 WebDriver BiDi 支持
WebDriver BiDi 是一种正在开发中的新型跨浏览器自动化协议,旨在结合 WebDriver “经典” 和 CDP 的优点。WebDriver BiDi 承诺双向通信,使其默认情况下速度更快,并且它还包含低级控制功能。
另请参阅
使用 Chrome 和 Firefox 自动化
Puppeteer 支持使用 Chrome 和 Firefox 进行 WebDriver BiDi 自动化。
Firefox 的集成正在接近与之前基于 CDP 的方法的功能一致。在专门的公告中了解更多信息。
衡量进度
为了评估 WebDriver BiDi 的功能,我们使用了全面的Puppeteer 测试套件
- 对于 Firefox,目前有不到60个测试失败,而超过82个新测试成功地使用了 WebDriver BiDi,证明了其不断增长的潜力。
- 对于 Chrome,大约 68% 的测试通过了 WebDriver BiDi,表明与基于 CDP 的方法相比,还有改进的空间。
入门
以下是使用 WebDriver BiDi 启动 Firefox 或 Chrome 的示例
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({
product: 'firefox', // or 'chrome'
protocol: 'webDriverBiDi',
});
const page = await browser.newPage();
...
await browser.close();
这是朝着更统一、更高效的跨浏览器自动化体验迈出的激动人心的一步。我们鼓励您使用 Puppeteer 探索 WebDriver BiDi,并加入我们一起塑造浏览器自动化的未来。
通过 WebDriver BiDi 支持的 Puppeteer 功能
-
浏览器和页面自动化
- Browser.close
- Frame.goto()(除了
referer
和referrerPolicy
) - Page.bringToFront
- Page.goBack()
- Page.goForward()
- Page.goto(除了
referer
和referrerPolicy
) - Page.reload(除了
ignoreCache
参数) - Page.setViewport(仅
width
、height
、deviceScaleFactor
) - Puppeteer.launch
-
脚本评估:
- JSHandle.evaluate
- JSHandle.evaluateHandle
- Page.evaluate
- Page.exposeFunction
-
- Page.$(Chrome 支持 ARIA 选择器)
- Page.$$(Chrome 支持 ARIA 选择器)
- Page.$$eval(Chrome 支持 ARIA 选择器)
- Page.$eval(Chrome 支持 ARIA 选择器)
- Page.waitForSelector(Chrome 支持 ARIA 选择器)
-
输入
- ElementHandle.uploadFile
- ElementHandle.click
- Keyboard.down
- Keyboard.press
- Keyboard.sendCharacter
- Keyboard.type
- Keyboard.up
- 鼠标事件(除了专用的拖放 API 方法)
- Page.tap
- TouchScreen.*
-
JavaScript 对话框拦截
- page.on('dialog')
- Dialog.*
-
截图(并非所有参数都支持)
- Page.screenshot(支持的参数
clip
、encoding
、fullPage
)
- Page.screenshot(支持的参数
-
PDF 生成(并非所有参数都支持)
- Page.pdf(仅支持
format
、height
、landscape
、margin
、pageRanges
、printBackground
、scale
、width
) - Page.createPDFStream(仅支持
format
、height
、landscape
、margin
、pageRanges
、printBackground
、scale
、width
)
- Page.pdf(仅支持
-
权限(仅在 Chrome 中支持)
- BrowserContext.clearPermissionOverrides()
- BrowserContext.overridePermissions()
Puppeteer 功能尚未通过 WebDriver BiDi 支持
-
- HTTPRequest.abort()
- HTTPRequest.abortErrorReason()
- HTTPRequest.client()
- HTTPRequest.continue()
- HTTPRequest.continueRequestOverrides()
- HTTPRequest.failure()
- HTTPRequest.finalizeInterceptions()
- HTTPRequest.interceptResolutionState()
- HTTPRequest.isInterceptResolutionHandled()
- HTTPRequest.respond()
- HTTPRequest.responseForRequest()
- Page.setRequestInterception()
-
各种模拟(大多数在 Chrome 中支持)
- Page.emulate()(仅在 Chrome 中支持)
- Page.emulateCPUThrottling()(仅在 Chrome 中支持)
- Page.emulateIdleState()(仅在 Chrome 中支持)
- Page.emulateMediaFeatures()(仅在 Chrome 中支持)
- Page.emulateMediaType()(仅在 Chrome 中支持)
- Page.emulateTimezone()(仅在 Chrome 中支持)
- Page.emulateVisionDeficiency()(仅在 Chrome 中支持)
- Page.setBypassCSP()(仅在 Chrome 中支持)
- Page.setCacheEnabled()(仅在 Chrome 中支持)
- Page.setGeolocation()(仅在 Chrome 中支持)
- Page.setJavaScriptEnabled()(仅在 Chrome 中支持)
-
CDP 特定功能
- Page.createCDPSession()(仅在 Chrome 中支持)
-
跟踪(仅在 Chrome 中支持)
-
覆盖率(仅在 Chrome 中支持)
-
无障碍功能(仅在 Chrome 中支持)
-
其他方法
- Browser.userAgent()
- Frame.isOOPFrame()
- Frame.waitForDevicePrompt()
- HTTPResponse.buffer()
- HTTPResponse.fromServiceWorker()
- HTTPResponse.securityDetails()
- Input.drag()
- Input.dragAndDrop()
- Input.dragOver()
- Input.drop()
- Page.authenticate()
- Page.cookies()
- Page.deleteCookie()
- Page.emulateNetworkConditions()
- Page.isDragInterceptionEnabled()
- Page.isJavaScriptEnabled()(仅在 Chrome 中支持)
- Page.isServiceWorkerBypassed()
- Page.metrics()
- Page.queryObjects()(仅在 Chrome 中支持)
- Page.screencast()(仅在 Chrome 中支持)
- Page.setBypassServiceWorker()
- Page.setCookie()
- Page.setDragInterception()
- Page.setExtraHTTPHeaders()
- Page.setOfflineMode()
- Page.setUserAgent()
- Page.waitForDevicePrompt()
- Page.waitForFileChooser()
- Page.workers()
- PageEvent.popup
- PageEvent.WorkerCreated
- PageEvent.WorkerDestroyed
- Target.opener()