Skip to main content
Version: 22.13.0

Experimental WebDriver BiDi support

WebDriver BiDi is a new cross-browser automation protocol currently under development, aiming to combine the best of both WebDriver “Classic” and CDP. WebDriver BiDi promises bi-directional communication, making it fast by default, and it comes packed with low-level control.

See also:

Automate with Chrome and Firefox

Puppeteer supports WebDriver BiDi automation with Chrome and Firefox.

Firefox integration is nearing feature parity with its previous CDP-based approach. Learn more in the dedicated announcement.

Measuring progress

To gauge the capabilities of WebDriver BiDi, we utilized the comprehensive Puppeteer test suite

  • For Firefox, there are currently under 30 failing tests compared to the CDP implementation, while over 140 new tests successfully utilize WebDriver BiDi, demonstrating its growing potential.
  • For Chrome, around 85% of tests pass with WebDriver BiDi, indicating room for improvement compared to the CDP-based approach.

Get started

Below is an example of launching Firefox or Chrome with WebDriver BiDi:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({
product: 'firefox', // or 'chrome'
protocol: 'webDriverBiDi',
const page = await browser.newPage();
await browser.close();

This is an exciting step towards a more unified and efficient cross-browser automation experience. We encourage you to explore WebDriver BiDi with Puppeteer and join us in shaping the future of browser automation.

Puppeteer features supported over WebDriver BiDi

  • Browser automation

    • Puppeteer.launch
    • Browser.close
    • Browser.userAgent()
  • Page automation

    • Page.bringToFront
    • Page.goBack()
    • Page.goForward()
    • Page.goto (except referer and referrerPolicy)
    • Frame.goto() (except referer and referrerPolicy)
    • Page.reload (except for ignoreCache parameter)
    • Page.setViewport (width, height, deviceScaleFactor only)
    • Page.cookies()
    • Page.setCookie()
    • Page.deleteCookie()
    • Page.workers()
    • PageEvent.WorkerCreated
    • PageEvent.WorkerDestroyed
    • Page.setExtraHTTPHeaders()
  • Script evaluation:

    • JSHandle.evaluate
    • JSHandle.evaluateHandle
    • Page.evaluate
    • Page.exposeFunction
  • Selectors and locators except for ARIA:

    • Page.$ (ARIA selectors supported in Chrome)
    • Page.$$ (ARIA selectors supported in Chrome)
    • Page.$$eval (ARIA selectors supported in Chrome)
    • Page.$eval (ARIA selectors supported in Chrome)
    • Page.waitForSelector (ARIA selectors supported in Chrome)
  • Input

    • ElementHandle.uploadFile
    • Keyboard.down
    • Keyboard.sendCharacter
    • Keyboard.type
    • Keyboard.up
    • Mouse events (except for dedicated drag'n'drop API methods)
    • Page.tap
    • TouchScreen.*
  • JavaScript dialog interception

    • page.on('dialog')
    • Dialog.*
  • Screenshots (not all parameters are supported)

    • Page.screenshot (supported parameters clip, encoding, fullPage)
  • PDF generation (not all parameters are supported)

    • Page.pdf (only format, height, landscape, margin, pageRanges, printBackground, scale, width are supported)
    • Page.createPDFStream (only format, height, landscape, margin, pageRanges, printBackground, scale, width are supported)
  • Permissions (Supported in Chrome only)

    • BrowserContext.clearPermissionOverrides()
    • BrowserContext.overridePermissions()
  • Request interception

    • HTTPRequest.abort() (no custom error support)
    • HTTPRequest.abortErrorReason()
    • HTTPRequest.continue()
    • HTTPRequest.continueRequestOverrides()
    • HTTPRequest.failure()
    • HTTPRequest.finalizeInterceptions()
    • HTTPRequest.interceptResolutionState()
    • HTTPRequest.isInterceptResolutionHandled()
    • HTTPRequest.respond()
    • HTTPRequest.responseForRequest()
    • Page.authenticate()
    • Page.setRequestInterception()
    • Page.setUserAgent()

Puppeteer features not yet supported over WebDriver BiDi

  • Various emulations (most are supported with Chrome)

    • Page.emulate() (supported only in Chrome)
    • Page.emulateCPUThrottling() (supported only in Chrome)
    • Page.emulateIdleState() (supported only in Chrome)
    • Page.emulateMediaFeatures() (supported only in Chrome)
    • Page.emulateMediaType() (supported only in Chrome)
    • Page.emulateTimezone() (supported only in Chrome)
    • Page.emulateVisionDeficiency() (supported only in Chrome)
    • Page.setBypassCSP() (supported only in Chrome)
    • Page.setCacheEnabled() (supported only in Chrome)
    • Page.setGeolocation() (supported only in Chrome)
    • Page.setJavaScriptEnabled() (supported only in Chrome)
  • CDP-specific features

    • Page.createCDPSession() (supported only in Chrome)
    • HTTPRequest.client() (supported only in Chrome)
  • Tracing (supported only in Chrome)

  • Coverage (supported only in Chrome)

  • Accessibility (supported only in Chrome)

  • Other methods:

    • Frame.isOOPFrame()
    • Frame.waitForDevicePrompt()
    • HTTPResponse.buffer()
    • HTTPResponse.fromServiceWorker()
    • HTTPResponse.securityDetails()
    • Input.drag()
    • Input.dragAndDrop()
    • Input.dragOver()
    • Input.drop()
    • Page.emulateNetworkConditions()
    • Page.isDragInterceptionEnabled()
    • Page.isJavaScriptEnabled() (supported only in Chrome)
    • Page.isServiceWorkerBypassed()
    • Page.metrics()
    • Page.queryObjects() (supported only in Chrome)
    • Page.screencast() (supported only in Chrome)
    • Page.setBypassServiceWorker()
    • Page.setDragInterception()
    • Page.setOfflineMode()
    • Page.waitForDevicePrompt()
    • Page.waitForFileChooser()
    • PageEvent.popup
    • Target.opener()