microsoft/playwright · error · DOMException
WebSocket is already in CLOSING or CLOSED state.
Error message
WebSocket is already in CLOSING or CLOSED state.
What it means
Error "WebSocket is already in CLOSING or CLOSED state." thrown in microsoft/playwright.
Source
Thrown at packages/injected/src/webSocketMock.ts:218
}
get onmessage() {
return this._onmessageListener;
}
set onmessage(listener) {
if (this._onmessageListener)
this.removeEventListener('message', this._onmessageListener as any);
this._onmessageListener = listener;
if (this._onmessageListener)
this.addEventListener('message', this._onmessageListener as any);
}
send(message: WebSocketMessage): void {
if (this.readyState === WebSocketMock.CONNECTING)
throw new DOMException(`Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.`);
if (this.readyState !== WebSocketMock.OPEN)
throw new DOMException(`WebSocket is already in CLOSING or CLOSED state.`);
if (this._passthrough) {
if (this._ws)
this._apiSendToServer(message);
} else {
messageToData(message, data => binding({ type: 'onMessageFromPage', id: this._id, data }));
}
}
close(code?: number, reason?: string): void {
if (code !== undefined && code !== 1000 && (code < 3000 || code > 4999))
throw new DOMException(`Failed to execute 'close' on 'WebSocket': The close code must be either 1000, or between 3000 and 4999. ${code} is neither.`);
if (this.readyState === WebSocketMock.OPEN || this.readyState === WebSocketMock.CONNECTING)
this.readyState = WebSocketMock.CLOSING;
if (this._passthrough)
this._apiCloseServer(code, reason, true);
else
binding({ type: 'onClosePage', id: this._id, code, reason, wasClean: true });
}View on GitHub (pinned to c8fc3bf8d3)
When it happens
Trigger: Thrown at packages/injected/src/webSocketMock.ts:218 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of microsoft/playwright@c8fc3bf8d3 (2026-08-12).
Data as JSON: /api/errors/0b4ccfe23d10f4c1.
Report an issue: GitHub.