diff --git a/packages/playwright-core/src/server/frames.ts b/packages/playwright-core/src/server/frames.ts index df8af491ba..1613356b56 100644 --- a/packages/playwright-core/src/server/frames.ts +++ b/packages/playwright-core/src/server/frames.ts @@ -377,7 +377,7 @@ export class FrameManager { onWebSocketRequest(requestId: string) { const ws = this._webSockets.get(requestId); - if (ws) + if (ws && ws.markAsNotified()) this._page.emit(Page.Events.WebSocket, ws); } diff --git a/packages/playwright-core/src/server/network.ts b/packages/playwright-core/src/server/network.ts index 8b23078093..6120b4a025 100644 --- a/packages/playwright-core/src/server/network.ts +++ b/packages/playwright-core/src/server/network.ts @@ -476,6 +476,7 @@ export class Response extends SdkObject { export class WebSocket extends SdkObject { private _url: string; + private _notified = false; static Events = { Close: 'close', @@ -489,6 +490,16 @@ export class WebSocket extends SdkObject { this._url = url; } + markAsNotified() { + // Sometimes we get "onWebSocketRequest" twice, at least in Chromium. + // Perhaps websocket is restarted because of chrome.webRequest extensions api? + // Or maybe the handshake response was a redirect? + if (this._notified) + return false; + this._notified = true; + return true; + } + url(): string { return this._url; }