What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

ConnectionTransport.send() sends a string over Puppeteer’s browser-connection transport; it is not the usual way to issue a Chrome DevTools Protocol (CDP) command. For CDP commands, call CDPSession.send(method, params). Supply a custom transport only when you need to adapt how Puppeteer connects to the browser, using the transport option in puppeteer.connect().

Choose the right send method

What you need to do Use What you pass
Issue a CDP command, such as evaluating a JavaScript expression CDPSession.send() A protocol method name and its parameters
Provide or adapt the low-level connection used by Puppeteer ConnectionTransport.send(), as part of a custom transport A string message; Puppeteer supplies and consumes messages through the adapter interface

For ordinary protocol work, use CDPSession.send(). Its documented signature is send(method, params?, options?), and it returns a promise for the command’s mapped result. The transport interface is a lower-level connection boundary, not a typed CDP command helper. See the CDPSession.send() reference and the ConnectionTransport reference.

Connect to a browser and send a CDP command

The following Node.js example connects to an existing browser, opens a page, creates a CDP session, and evaluates an expression. It assumes puppeteer is installed and BROWSER_WS_ENDPOINT contains a reachable browser WebSocket endpoint.

const puppeteer = require('puppeteer');

async function main() {
  const browserWSEndpoint = process.env.BROWSER_WS_ENDPOINT;
  if (!browserWSEndpoint) {
    throw new Error('Set BROWSER_WS_ENDPOINT to the browser WebSocket endpoint');
  }

  const browser = await puppeteer.connect({ browserWSEndpoint });
  try {
    const page = await browser.newPage();
    const session = await page.createCDPSession();
    const result = await session.send('Runtime.evaluate', {
      expression: '1 + 1',
    });
    console.log(result);
    await session.detach();
  } finally {
    await browser.disconnect();
  }
}

main().catch(error => {
  console.error(error);
  process.exitCode = 1;
});

Check the command name and parameter names against the protocol version supported by the browser you connect to. The documented connect() function resolves to a Browser. The browser WebSocket endpoint can be obtained with browser.wsEndpoint() or read as webSocketDebuggerUrl from http://HOST:PORT/json/version; see the Browser.wsEndpoint() reference.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

When to implement ConnectionTransport

Use a custom adapter when Puppeteer’s connection mechanism needs to be supplied or adapted. The public interface documents the responsibilities below, but does not provide a complete transport implementation:

  • send(message: string) sends the transport message.
  • onmessage receives a string message from the underlying connection.
  • onclose signals that the underlying connection has closed.
  • close() closes the transport.

Pass your adapter instance as transport to puppeteer.connect(). The official ConnectOptions reference lists this option. Because the API reference defines the boundary rather than a full adapter recipe, the underlying connection’s message ordering, buffering, backpressure, reconnection, and error handling must be designed and verified for your transport and Puppeteer version. Do not assume Puppeteer’s interface itself supplies those behaviors.

Find and verify a browser WebSocket endpoint

  1. Start or provision a browser that exposes a debugging connection, and ensure the client can reach it.
  2. Obtain the endpoint from the browser’s wsEndpoint() method, or request http://HOST:PORT/json/version and read the webSocketDebuggerUrl value.
  3. Pass the full WebSocket URL, typically shaped like ws://HOST:PORT/devtools/browser/<id>, in browserWSEndpoint when calling puppeteer.connect().
  4. After connecting, create a CDP session and send the protocol command through session.send().

The endpoint format and lookup are documented in the endpoint reference. A remote browser must be running and its debugging endpoint must be accessible to the process making the connection.

Runtime and version considerations

The official API pages referenced here displayed Puppeteer version 25.12.0 when accessed on October 3, 2026. Option availability and behavior can change between releases, so check the API reference for the version installed in your project.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Puppeteer’s browser-compatible build can connect over WebSocket to an already running browser. The browser runtime guide says launching or downloading a browser is unsupported there because those operations depend on Node.js APIs. Use Node.js for workflows that must launch or download a browser; see Running Puppeteer in the browser.

The ConnectOptions reference states that the protocol defaults to CDP when connecting to a browser, CDP when launching Chrome, and WebDriver BiDi when launching Firefox. It also lists protocolTimeout with a default of 180,000 milliseconds for individual CDP calls; consult the versioned ConnectOptions reference before changing connection settings.

Troubleshooting

  • connect() cannot connect: Check that the WebSocket endpoint is complete, reachable from the client, and belongs to a running browser. Verify the endpoint using the documented wsEndpoint() or /json/version lookup.
  • A command fails or returns an unexpected result: Confirm that the protocol method and parameter names match the browser’s CDP version. Use CDPSession.send() for the command rather than passing a method name to the transport interface.
  • A custom transport sends nothing or stops receiving messages: Check that its send, onmessage, onclose, and close behavior correctly bridges the underlying connection. The API reference does not prescribe buffering or reconnection behavior, so inspect and test those parts in your adapter.
  • Browser launch fails in a browser runtime: That runtime supports connecting to an existing browser, not launching or downloading one. Perform launch and download operations in Node.js.
  • A CDP call exceeds its timeout: Check the connection and command’s execution conditions, then review the installed version’s protocolTimeout setting in ConnectOptions.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

For a website screenshot rather than a custom Puppeteer transport, ScreenshotNeo provides a screenshot API and MCP server. One GET request returns an image or PDF; the API documentation is at ScreenshotNeo docs.

Best Value
The SQL Programming Language: .
  • Used Book in Good Condition
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

ScreenshotNeo accepts cookie or consent banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; those steps can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits cost nothing, with page verdict and billing status reported in response headers. Its MCP server gives AI agents tools for screenshots, page information, and PDF capture. The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Sign up for ScreenshotNeo’s free plan.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.