WebDriver BiDi 支持
WebDriver BiDi 是一个正在开发中的新型跨浏览器自动化协议,旨在结合 WebDriver “经典” 和 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.emulateTimezone()
- Page.emulateVisionDeficiency()
- Page.setBypassCSP()
- Page.setGeolocation()
- Page.setJavaScriptEnabled()
-
CDP 特定功能
- HTTPRequest.client()
- Page.createCDPSession()
-
辅助功能
-
覆盖率
-
跟踪
-
其他方法
- Frame.waitForDevicePrompt()
- HTTPResponse.buffer()
- HTTPResponse.fromServiceWorker()
- HTTPResponse.securityDetails()
- Input.drag()
- Input.dragAndDrop()
- Input.dragOver()
- Input.drop()
- Page.emulateNetworkConditions()
- Page.isDragInterceptionEnabled()
- Page.isJavaScriptEnabled()
- Page.isServiceWorkerBypassed()
- Page.metrics()
- Page.queryObjects()
- Page.screencast()
- Page.setBypassServiceWorker()
- Page.setDragInterception()
- Page.setOfflineMode()
- Page.waitForDevicePrompt()
- Page.waitForFileChooser()
- 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.setViewport (仅限
width
、height
、deviceScaleFactor
) - 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() 和所有定位器 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()
-
- 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()