{"record":{"id":"868f1300bd9d7a95","repo":"microsoft/playwright","slug":"passing-a-connectiontransport-to-connectovercdp-is","errorCode":null,"errorMessage":"Passing a ConnectionTransport to connectOverCDP is not supported when connecting remotely.","messagePattern":"Passing a ConnectionTransport to connectOverCDP is not supported when connecting remotely\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/client/browserType.ts","lineNumber":153,"sourceCode":"      return browser;\n    });\n  }\n\n  async connectOverCDP(options: api.ConnectOverCDPOptions  & { wsEndpoint?: string }): Promise<api.Browser>;\n  async connectOverCDP(endpointURL: string, options?: api.ConnectOverCDPOptions): Promise<api.Browser>;\n  async connectOverCDP(transport: api.ConnectOverCDPTransport, options?: api.ConnectOverCDPOptions): Promise<api.Browser>;\n  async connectOverCDP(overloaded: (api.ConnectOverCDPOptions & { wsEndpoint?: string }) | string | api.ConnectOverCDPTransport, options?: api.ConnectOverCDPOptions): Promise<Browser> {\n    let endpointURL: string | undefined;\n    let transport: api.ConnectOverCDPTransport | undefined;\n    let params: api.ConnectOverCDPOptions;\n    if (typeof overloaded === 'string') {\n      endpointURL = overloaded;\n      params = options ?? {};\n    } else if (isConnectionTransport(overloaded)) {\n      if (this.name() !== 'chromium' && this.name() !== 'webkit')\n        throw new Error('Connecting over CDP is only supported in Chromium and WebKit.');\n      if (this._connection.isRemote())\n        throw new Error('Passing a ConnectionTransport to connectOverCDP is not supported when connecting remotely.');\n      transport = overloaded;\n      params = options ?? {};\n    } else {\n      endpointURL = 'endpointURL' in overloaded ? (overloaded as any).endpointURL : overloaded.wsEndpoint;\n      assert(endpointURL, 'Cannot connect over CDP without wsEndpoint.');\n      params = overloaded;\n    }\n    if (endpointURL && this.name() !== 'chromium' && this.name() !== 'webkit')\n      throw new Error('Connecting over CDP is only supported in Chromium and WebKit.');\n\n    const result = await this._channel.connectOverCDP({\n      endpointURL,\n      transport: transport as any,\n      headers: params.headers ? headersObjectToArray(params.headers) : undefined,\n      slowMo: params.slowMo,\n      isLocal: params.isLocal,\n      noDefaults: params.noDefaults,\n      artifactsDir: params.artifactsDir,","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/client/browserType.ts#L135-L171","documentation":"Thrown in connectOverCDP() when a ConnectionTransport is passed AND the connection itself is remote (this._connection.isRemote()). Passing a raw transport (send/close) only works when the client owns the local process; a thin client forwarding to another server cannot relay an arbitrary transport object.","triggerScenarios":"Using playwright-client/thin mode and calling `chromium.connectOverCDP({ send, close })`. isConnectionTransport is true, name is chromium, but isRemote() is true.","commonSituations":"Reusing a transport-based CDP snippet from a full-client setup inside a remote/thin deployment; bridging two hops (client -> server -> CDP) which the transport API doesn't support.","solutions":["Use the endpointURL overload from thin clients: `connectOverCDP('ws://...')`.","Run from the full playwright-core package where the connection is local.","Implement the CDP bridge on the server side and expose a WS endpoint instead."],"exampleFix":"// before\nawait chromium.connectOverCDP({ send, close }); // from thin client\n// after\nawait chromium.connectOverCDP('ws://localhost:9222/devtools/browser/...');","handlingStrategy":"type-guard","validationCode":"const isRemote = (browserType as any)._connection?.isRemote?.();\nif (isRemote && isTransportArg(arg))\n  throw new Error('Cannot pass a transport from a thin client; pass an endpoint URL.');","typeGuard":"function isConnectionTransport(v: any): boolean {\n  return !!v && typeof v === 'object'\n    && typeof v.send === 'function' && typeof v.close === 'function';\n}","tryCatchPattern":null,"preventionTips":["From thin clients, always pass a WS endpoint URL.","Run transport-based CDP from the full package where the connection is local."],"tags":["cdp","connect","thin-client","transport"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}