WebSocketRoute
WebSocket
ルートが page.routeWebSocket() または browserContext.routeWebSocket() で設定されるたびに、WebSocketRoute
オブジェクトは、実際のサーバーが行うように、WebSocket を処理することを可能にします。
モック
デフォルトでは、ルーティングされた WebSocket はサーバーに接続しません。これにより、WebSocket を介した通信全体をモックできます。以下は、"request"
に "response"
で応答する例です。
await page.routeWebSocket('wss://example.com/ws', ws => {
ws.onMessage(message => {
if (message === 'request')
ws.send('response');
});
});
WebSocket ルートハンドラー内で webSocketRoute.connectToServer() を呼び出さないため、Playwright は WebSocket がモックされるとみなし、ページ内で WebSocket を自動的に開きます。
JSON メッセージを処理する別の例を次に示します。
await page.routeWebSocket('wss://example.com/ws', ws => {
ws.onMessage(message => {
const json = JSON.parse(message);
if (json.request === 'question')
ws.send(JSON.stringify({ response: 'answer' }));
});
});
インターセプト
あるいは、実際のサーバーに接続したいが、途中でメッセージをインターセプトして変更またはブロックしたい場合もあります。webSocketRoute.connectToServer() を呼び出すと、サーバー側の WebSocketRoute
インスタンスが返され、メッセージを送信したり、受信メッセージを処理したりできます。
以下は、ページからサーバーに送信される一部のメッセージを変更する例です。サーバーからページに送信されるメッセージはそのまま残り、デフォルトの転送に依存しています。
await page.routeWebSocket('/ws', ws => {
const server = ws.connectToServer();
ws.onMessage(message => {
if (message === 'request')
server.send('request2');
else
server.send(message);
});
});
サーバーに接続すると、すべての**メッセージは転送されます**デフォルトでは、ページとサーバーの間で転送されます。
ただし、元のルートで webSocketRoute.onMessage() を呼び出すと、ページからサーバーへのメッセージは**転送されなくなります**が、代わりに handler によって処理される必要があります。
同様に、サーバー側の WebSocket で webSocketRoute.onMessage() を呼び出すと、サーバーからページへの**メッセージの転送が停止します**。handler がそれらの処理を担当する必要があります。
次の例は、双方向で一部のメッセージをブロックします。双方向で webSocketRoute.onMessage() を呼び出すため、自動転送は一切ありません。
await page.routeWebSocket('/ws', ws => {
const server = ws.connectToServer();
ws.onMessage(message => {
if (message !== 'blocked-from-the-page')
server.send(message);
});
server.onMessage(message => {
if (message !== 'blocked-from-the-server')
ws.send(message);
});
});
メソッド
close
v1.48 で追加WebSocket 接続の一方の側を閉じます。
使用法
await webSocketRoute.close();
await webSocketRoute.close(options);
引数
戻り値
connectToServer
v1.48 で追加デフォルトでは、ルーティングされた WebSocket はサーバーに接続しないため、WebSocket 通信全体をモックできます。このメソッドは実際の WebSocket サーバーに接続し、サーバー側の WebSocketRoute インスタンスを返し、サーバーとの間でメッセージを送受信できるようにします。
サーバーに接続すると
- サーバーから受信したメッセージは、サーバー側の
WebSocketRoute
で webSocketRoute.onMessage() が呼び出されない限り、ページ内の WebSocket に**自動的に転送されます**。 - ページ内の
WebSocket.send()
呼び出しによって送信されたメッセージは、元のWebSocketRoute
で webSocketRoute.onMessage() が呼び出されない限り、サーバーに**自動的に転送されます**。
詳細については、上部の例を参照してください。
使用法
webSocketRoute.connectToServer();
戻り値
onClose
v1.48 で追加WebSocket.close
を処理できます。
デフォルトでは、ページまたはサーバーのいずれかで接続の一方の側を閉じると、もう一方の側も閉じられます。ただし、webSocketRoute.onClose() ハンドラーが設定されている場合、クロージャのデフォルトの転送は無効になり、ハンドラーがそれを処理する必要があります。
使用法
webSocketRoute.onClose(handler);
引数
-
handler
関数(数値 | [undefined]):Promise<オブジェクト> | オブジェクト#WebSocket のクローズを処理する関数。オプションの close コード とオプションの close 理由 を受け取ります。
onMessage
v1.48 で追加このメソッドを使用すると、ページまたはサーバーから送信された WebSocket によって送信されるメッセージを処理できます。
元の WebSocket ルートで呼び出されると、このメソッドはページから送信されたメッセージを処理します。これらのメッセージを処理するには、webSocketRoute.send() で応答するか、webSocketRoute.connectToServer() によって返されるサーバー側の接続に転送するか、または何か他のことを行います。
このメソッドが呼び出されると、メッセージは自動的にサーバーまたはページに転送されません。代わりに、webSocketRoute.send() を呼び出して手動で行う必要があります。詳細については、上部の例を参照してください。
このメソッドを再度呼び出すと、ハンドラーが新しいハンドラーで上書きされます。
使用法
webSocketRoute.onMessage(handler);
引数
send
v1.48 で追加WebSocket にメッセージを送信します。元の WebSocket で呼び出されると、ページにメッセージを送信します。webSocketRoute.connectToServer() の結果として呼び出されると、サーバーにメッセージを送信します。詳細については、上部の例を参照してください。
使用法
webSocketRoute.send(message);
引数
url
v1.48 で追加ページで作成された WebSocket の URL。
使用法
webSocketRoute.url();
戻り値