Implementation:Microsoft Playwright BidiOverCdp
| Knowledge Sources | |
|---|---|
| Domains | BiDi, CDP |
| Last Updated | 2026-02-12 00:00 GMT |
Overview
Concrete tool for bridging the WebDriver BiDi protocol over Chrome DevTools Protocol (CDP) for Chromium browsers provided by the Playwright library.
Description
The `connectBidiOverCdp` function creates a BiDi protocol transport layer on top of an existing CDP connection using the `chromium-bidi` library. It instantiates a `BidiServer` (from chromium-bidi's `BidiMapper`) that translates between BiDi commands and CDP commands. The module defines internal adapter classes: `BidiTransportImpl` bridges BiDi messages between the server and the returned `BidiConnection`, `CdpTransportImpl` wraps the raw CDP transport for the mapper, and `BidiConnection` implements `ConnectionTransport` to expose the BiDi connection as a standard Playwright transport.
Usage
Use BidiOverCdp when Playwright needs to communicate with Chromium browsers using the BiDi protocol, since Chromium does not natively support BiDi and requires this CDP-to-BiDi translation layer.
Code Reference
Source Location
- Repository: Microsoft_Playwright
- File: packages/playwright-core/src/server/bidi/bidiOverCdp.ts
Signature
export async function connectBidiOverCdp(cdp: ConnectionTransport): Promise<ConnectionTransport>;
Import
import { connectBidiOverCdp } from '../server/bidi/bidiOverCdp';
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| cdp | ConnectionTransport | Yes | The raw CDP transport connected to a Chromium browser |
Outputs
| Name | Type | Description |
|---|---|---|
| transport | ConnectionTransport | A BiDi protocol transport wrapping the CDP connection |
Usage Examples
import { connectBidiOverCdp } from '../server/bidi/bidiOverCdp';
// Given a raw CDP transport to a Chromium browser
const bidiTransport = await connectBidiOverCdp(cdpTransport);
// bidiTransport can now be used to send/receive BiDi protocol messages
bidiTransport.onmessage = (message) => handleBidiMessage(message);
bidiTransport.send(JSON.stringify({ method: 'browser.close', params: {} }));