跳至主要內容
版本:23.11.1

WebDriver BiDi 支援

WebDriver BiDi 是一種新的跨瀏覽器自動化協定,目前正在開發中,旨在結合 WebDriver “Classic” 和 CDP 的優點。 WebDriver BiDi 啟用雙向通訊,使其預設速度很快,並具備底層控制功能。

使用 Chrome 和 Firefox 自動化

Puppeteer 支援使用 Chrome 和 Firefox 進行 WebDriver BiDi 自動化。使用 Puppeteer 啟動 Firefox 時,預設會啟用 WebDriver BiDi 協定。啟動 Chrome 時,預設仍使用 CDP,因為並非所有 CDP 功能都已受 WebDriver BiDi 支援。如果 WebDriver BiDi 尚不支援某些 Puppeteer 功能,則會擲回 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() (refererreferrerPolicy 除外)
    • Page 'popup' 事件
    • Page.bringToFront()
    • Page.cookies()
    • Page.deleteCookie()
    • Page.goBack()
    • Page.goForward()
    • Page.goto (refererreferrerPolicy 除外)
    • Page.reload (ignoreCache 參數除外)
    • Page.setCacheEnabled()
    • Page.setCookie()
    • Page.setExtraHTTPHeaders()
    • Page.setViewport (僅限 widthheightdeviceScaleFactor)
    • Page.workers()
    • PageEvent.WorkerCreated
    • PageEvent.WorkerDestroyed
    • Target.opener()
  • 指令碼評估:

    • JSHandle.evaluate()
    • JSHandle.evaluateHandle()
    • Page.evaluate()
    • Page.evaluateOnNewDocument()
    • Page.exposeFunction()
  • 選取器定位器,ARIA 除外

    • 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 (支援的參數為 clipencodingfullPage)
  • PDF 產生 (並非所有參數都受支援)

    • Page.pdf (僅支援 formatheightlandscapemarginpageRangesprintBackgroundscalewidth)
    • Page.createPDFStream (僅支援 formatheightlandscapemarginpageRangesprintBackgroundscalewidth)
  • 權限

    • 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()

另請參閱