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");
});
});
Поскольку мы не вызываем WebSocketRoute.ConnectToServer внутри обработчика маршрута WebSocket, 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() на оригинальном маршруте, сообщения от страницы к серверу больше не будут пересылаться, но должны обрабатываться обработчиком.
Аналогично, вызов WebSocketRoute.OnMessage() на серверной стороне WebSocket прекратит пересылку сообщений с сервера на страницу, и обработчик должен позаботиться о них.
Следующий пример блокирует некоторые сообщения в обоих направлениях. Поскольку он вызывает 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.48Закрывает одну сторону WebSocket-соединения.
Использование
await WebSocketRoute.CloseAsync(options);
Аргументы
options
WebSocketRouteCloseOptions?
(опционально)-
Опциональный код закрытия.
-
Опциональная причина закрытия.
-
Возвращает
ConnectToServer
Добавлено в: v1.48По умолчанию маршрутизированный WebSocket не подключается к серверу, чтобы вы могли имитировать всю коммуникацию через WebSocket. Этот метод подключается к реальному WebSocket-серверу и возвращает серверную инстанцию WebSocketRoute, предоставляя возможность отправлять и получать сообщения с сервера.
После подключения к серверу:
- Сообщения, полученные с сервера, будут автоматически пересылаться в WebSocket на странице, если только WebSocketRoute.OnMessage() не вызван на серверной стороне
WebSocketRoute
. - Сообщения, отправленные вызовом
WebSocket.send()
на странице, будут автоматически пересылаться на сервер, если только WebSocketRoute.OnMessage() не вызван на оригинальномWebSocketRoute
.
Смотрите примеры в начале для более подробной информации.
Использование
WebSocketRoute.ConnectToServer
Возвращает
OnClose
Добавлено в: v1.48Позволяет обрабатывать WebSocket.close
.
По умолчанию закрытие одной стороны соединения, либо на странице, либо на сервере, закроет другую сторону. Однако, когда обработчик WebSocketRoute.OnClose() настроен, автоматическая пересылка закрытия отключается, и обработчик должен позаботиться об этом.
Использование
WebSocketRoute.OnClose(handler);
Аргументы
-
handler
Action<int?, string>#Функция, которая будет обрабатывать закрытие WebSocket. Получает опциональный код закрытия и опциональную причину закрытия.
OnMessage
Добавлено в: v1.48Этот метод позволяет обрабатывать сообщения, которые отправляются через WebSocket, как со страницы, так и с сервера.
Когда вызывается на оригинальном маршруте WebSocket, этот метод обрабатывает сообщения, отправленные со страницы. Вы можете обрабатывать эти сообщения, отвечая на них с помощью WebSocketRoute.Send(), пересылая их на серверную сторону соединения, возвращаемую WebSocketRoute.ConnectToServer, или делая что-то еще.
После вызова этого метода сообщения не пересылаются автоматически на сервер или на страницу - вы должны сделать это вручную, вызывая WebSocketRoute.Send(). Смотрите примеры в начале для более подробной информации.
Повторный вызов этого метода заменит обработчик на новый.
Использование
WebSocketRoute.OnMessage(handler);
Аргументы
-
handler
Action<WebSocketFrame>#Функция, которая будет обрабатывать сообщения.
Send
Добавлено в: v1.48Отправляет сообщение в WebSocket. Когда вызывается на оригинальном WebSocket, отправляет сообщение на страницу. Когда вызывается на результате WebSocketRoute.ConnectToServer, отправляет сообщение на сервер. Смотрите примеры в начале для более подробной информации.
Использование
WebSocketRoute.Send(message);
Аргументы
Url
Добавлено в: v1.48URL WebSocket, созданного на странице.
Использование
WebSocketRoute.Url
Возвращает