WebSocketRoute
WebSocket
ルートが Page.RouteWebSocketAsync() または BrowserContext.RouteWebSocketAsync() で設定されるたびに、WebSocketRoute
オブジェクトは、実際のサーバーが行うように WebSocket を処理することを可能にします。
モック
デフォルトでは、ルーティングされたWebSocketはサーバーに接続しません。これにより、WebSocketを介した通信全体をモックすることができます。以下は、"request"
に"response"
で応答する例です。
await page.RouteWebSocketAsync("wss://example.com/ws", ws => {
ws.OnMessage(frame => {
if (frame.Text == "request")
ws.Send("response");
});
});
WebSocketルートハンドラ内で WebSocketRoute.ConnectToServer を呼び出さないため、PlaywrightはWebSocketがモックされると仮定し、ページ内でWebSocketを自動的に開きます。
以下はJSONメッセージを処理する別の例です。
await page.RouteWebSocketAsync("wss://example.com/ws", ws => {
ws.OnMessage(frame => {
using var jsonDoc = JsonDocument.Parse(frame.Text);
JsonElement root = jsonDoc.RootElement;
if (root.TryGetProperty("request", out JsonElement requestElement) && requestElement.GetString() == "question")
{
var response = new Dictionary<string, string> { ["response"] = "answer" };
string jsonResponse = JsonSerializer.Serialize(response);
ws.Send(jsonResponse);
}
});
});
インターセプト
あるいは、実際のサーバーに接続しながら、途中でメッセージをインターセプトして変更したりブロックしたりすることもできます。WebSocketRoute.ConnectToServer を呼び出すと、サーバー側の WebSocketRoute
インスタンスが返され、これを使用してメッセージを送信したり、受信メッセージを処理したりできます。
以下は、ページからサーバーに送信された一部のメッセージを変更する例です。サーバーからページに送信されたメッセージはそのままにされ、デフォルトの転送に依存しています。
await page.RouteWebSocketAsync("/ws", ws => {
var server = ws.ConnectToServer();
ws.OnMessage(frame => {
if (frame.Text == "request")
server.Send("request2");
else
server.Send(frame.Text);
});
});
サーバーに接続すると、すべての**メッセージは**デフォルトでページとサーバー間で**転送されます**。
ただし、元のルートで WebSocketRoute.OnMessage() を呼び出すと、ページからサーバーへのメッセージは**転送されなくなり**、代わりに ハンドラ で処理される必要があります。
同様に、サーバー側のWebSocketで WebSocketRoute.OnMessage() を呼び出すと、サーバーからページへの**メッセージの転送が停止し**、ハンドラがそれらを処理する必要があります。
以下の例では、両方向のいくつかのメッセージをブロックします。WebSocketRoute.OnMessage() が両方向で呼び出されるため、自動転送はまったく行われません。
await page.RouteWebSocketAsync("/ws", ws => {
var server = ws.ConnectToServer();
ws.OnMessage(frame => {
if (frame.Text != "blocked-from-the-page")
server.Send(frame.Text);
});
server.OnMessage(frame => {
if (frame.Text != "blocked-from-the-server")
ws.Send(frame.Text);
});
});
メソッド
CloseAsync
追加バージョン: v1.48WebSocket接続の片側を閉じます。
使用法
await WebSocketRoute.CloseAsync(options);
引数
options
WebSocketRouteCloseOptions?
(任意)
戻り値
ConnectToServer
追加バージョン: v1.48デフォルトでは、ルーティングされたWebSocketはサーバーに接続しないため、WebSocket通信全体をモックできます。このメソッドは実際のWebSocketサーバーに接続し、サーバー側のWebSocketRouteインスタンスを返し、サーバーからメッセージを送受信する機能を提供します。
サーバーに接続すると
- サーバーから受信したメッセージは、サーバー側の
WebSocketRoute
でWebSocketRoute.OnMessage()が呼び出されない限り、ページのWebSocketに**自動的に転送されます**。 - ページで
WebSocket.send()
呼び出しによって送信されたメッセージは、元のWebSocketRoute
でWebSocketRoute.OnMessage()が呼び出されない限り、サーバーに**自動的に転送されます**。
詳細については、冒頭の例を参照してください。
使用法
WebSocketRoute.ConnectToServer
戻り値
OnClose
追加バージョン: v1.48WebSocket.close
を処理できます。
デフォルトでは、ページまたはサーバーのいずれかで接続の片側を閉じると、もう一方の側も閉じられます。ただし、WebSocketRoute.OnClose()ハンドラが設定されている場合、クローズのデフォルト転送は無効になり、ハンドラがそれを処理する必要があります。
使用法
WebSocketRoute.OnClose(handler);
引数
OnMessage
追加バージョン: v1.48このメソッドは、WebSocketによって、ページからまたはサーバーから送信されるメッセージを処理できます。
元のWebSocketルートで呼び出された場合、このメソッドはページから送信されたメッセージを処理します。WebSocketRoute.Send()で応答したり、WebSocketRoute.ConnectToServerによって返されるサーバー側接続に転送したり、その他の処理を行うことで、これらのメッセージを処理できます。
このメソッドが呼び出されると、メッセージはサーバーまたはページに自動的に転送されません。WebSocketRoute.Send()を呼び出して手動で行う必要があります。詳細については、冒頭の例を参照してください。
このメソッドを再度呼び出すと、ハンドラが新しいものに上書きされます。
使用法
WebSocketRoute.OnMessage(handler);
引数
-
handler
Action<WebSocketFrame>#メッセージを処理する関数。
Send
追加バージョン: v1.48WebSocketにメッセージを送信します。元のWebSocketで呼び出された場合は、ページにメッセージを送信します。WebSocketRoute.ConnectToServerの結果で呼び出された場合は、サーバーにメッセージを送信します。詳細については、冒頭の例を参照してください。
使用法
WebSocketRoute.Send(message);
引数
Url
追加バージョン: v1.48ページで作成されたWebSocketのURL。
使用法
WebSocketRoute.Url
戻り値