WebDriver BiDi 支持
WebDriver BiDi 是一个正在开发中的全新跨浏览器自动化协议,旨在融合 WebDriver “Classic” 和 CDP 两者的优点。WebDriver BiDi 支持双向通信,默认速度更快,并且内置了底层控制能力。
使用 Chrome 和 Firefox 进行自动化
Puppeteer 支持使用 Chrome 和 Firefox 进行 WebDriver BiDi 自动化。使用 Puppeteer 启动 Firefox 时,默认启用 WebDriver BiDi 协议。启动 Chrome 时,由于 WebDriver BiDi 尚未支持所有 CDP 功能,默认仍使用 CDP。如果某个 Puppeteer 功能尚不受 WebDriver BiDi 支持,则会抛出 UnsupportedOperation 错误。另请参阅下文关于 WebDriver BiDi 支持内容的列表。
快速开始
以下是通过 WebDriver BiDi 启动 Firefox 或 Chrome 的示例:
import puppeteer from 'puppeteer';
const firefoxBrowser = await puppeteer.launch({
browser: 'firefox', // WebDriver BiDi is used by default.
});
const page = await firefoxBrowser.newPage();
...
await firefoxBrowser.close();
const chromeBrowser = await puppeteer.launch({
browser: 'chrome',
protocol: 'webDriverBiDi', // CDP would be used by default for Chrome.
});
const page = await chromeBrowser.newPage();
...
await chromeBrowser.close();
WebDriver BiDi 不支持的 Puppeteer 功能
-
各类模拟
- Page.emulate()
- Page.emulateCPUThrottling()
- Page.emulateIdleState()
- Page.emulateMediaFeatures()
- Page.emulateMediaType()
- Page.emulateVisionDeficiency()
- Page.setBypassCSP()
-
CDP 特定功能
- HTTPRequest.client()
- HTTPRequest.resourceType()
- Page.createCDPSession()
- Page.extensionRealms()
- Page.triggerExtensionAction()
- Frame.extensionRealms()
- Realm.extension()
- Realm.realmId()
-
无障碍
-
覆盖率
-
追踪
-
其他方法:
- Frame.waitForDevicePrompt()
- HTTPResponse.buffer()
- HTTPResponse.content()
- HTTPResponse.text()
- HTTPResponse.fromServiceWorker()
- HTTPResponse.securityDetails()
- Input.drag()
- Input.dragAndDrop()
- Input.dragOver()
- Input.drop()
- Page.emulateNetworkConditions()
- Page.isDragInterceptionEnabled()
- Page.isServiceWorkerBypassed()
- Page.metrics()
- Page.queryObjects()
- Page.screencast()
- Page.setBypassServiceWorker()
- Page.setDragInterception()
- Page.setOfflineMode()
- Page.waitForDevicePrompt()
- PageEvent.popup
WebDriver BiDi 完全支持的 Puppeteer 功能
-
浏览器自动化
- Browser.close()
- Browser.userAgent()
- Browser.version()
- Puppeteer.launch()
-
页面自动化
- Frame.goto()(
referer和referrerPolicy除外) - Page 'popup' 事件
- Page.bringToFront()
- Page.cookies()
- Page.deleteCookie()
- Page.goBack()
- Page.goForward()
- Page.goto(
referer和referrerPolicy除外) - Page.reload(
ignoreCache参数除外) - Page.setCacheEnabled()
- Page.setCookie()
- Page.setExtraHTTPHeaders()
- Page.setGeolocation()
- Page.setViewport(仅支持
width、height、deviceScaleFactor) - Page.waitForFileChooser()
- Page.workers()
- PageEvent.WorkerCreated
- PageEvent.WorkerDestroyed
- Target.opener()
- Frame.goto()(
-
脚本求值:
- JSHandle.evaluate()
- JSHandle.evaluateHandle()
- Page.evaluate()
- Page.evaluateOnNewDocument()
- Page.exposeFunction()
-
- Page.$
- Page.$$
- Page.$$eval
- Page.$eval
- Page.waitForSelector
- Page.locator() 及所有 locator API
-
输入
- ElementHandle.click
- ElementHandle.uploadFile
- 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(仅支持
-
权限
- BrowserContext.clearPermissionOverrides()
- BrowserContext.overridePermissions()
-
各类模拟
- Page.emulateTimezone()
- Page.isJavaScriptEnabled()
- Page.setJavaScriptEnabled()
-
- HTTPRequest.abort()(不支持自定义错误)
- HTTPRequest.abortErrorReason()
- HTTPRequest.continue()
- HTTPRequest.continueRequestOverrides()
- HTTPRequest.failure()
- HTTPRequest.finalizeInterceptions()
- HTTPRequest.interceptResolutionState()
- HTTPRequest.isInterceptResolutionHandled()
- HTTPRequest.respond()
- HTTPRequest.responseForRequest()
- Page.authenticate()
- Page.setRequestInterception()
- Page.setUserAgent()