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');
});
});
Поскольку мы не вызываем webSocketRoute.connectToServer() внутри обработчика маршрута WebSocket, 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() на оригинальном маршруте, сообщения от страницы к серверу больше не будут пересылаться, но должны обрабатываться обработчиком.
Аналогично, вызов webSocketRoute.onMessage() на серверном WebSocket прекратит пересылку сообщений с сервера на страницу, и обработчик должен позаботиться о них.
Следующий пример блокирует некоторые сообщения в обоих направлениях. Поскольку он вызывает 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);
Аргументы
options
[Object] (опционально)-
code
[number] (опционально)#Опциональный код закрытия.
-
reason
[string] (опционально)#Опциональная причина закрытия.
-
Возвращает
- [Promise]<[void]>#
connectToServer
Добавлено в: v1.48По умолчанию, маршрутизированный WebSocket не подключается к серверу, чтобы вы могли мокировать всю коммуникацию через WebSocket. Этот метод подключается к реальному WebSocket-серверу и возвращает серверный экземпляр [WebSocketRoute], предоставляя возможность отправлять и получать сообщения с сервера.
После подключения к серверу:
- Сообщения, полученные с сервера, будут автоматически пересылаться в WebSocket на странице, если только webSocketRoute.onMessage() не вызван на серверной стороне
WebSocketRoute
. - Сообщения, отправленные вызовом
WebSocket.send()
на странице, будут автоматически пересылаться на сервер, если только webSocketRoute.onMessage() не вызван на оригинальнойWebSocketRoute
.
Смотрите примеры в начале для более подробной информации.
Использование
webSocketRoute.connectToServer();
Возвращает
- [WebSocketRoute]#
onClose
Добавлено в: v1.48Позволяет обрабатывать WebSocket.close
.
По умолчанию, закрытие одной стороны соединения, будь то на странице или на сервере, закроет другую сторону. Однако, когда установлен обработчик webSocketRoute.onClose(), автоматическая пересылка закрытия отключается, и обработчик должен позаботиться об этом.
Использование
webSocketRoute.onClose(handler);
Аргументы
-
handler
[function]([number] | [undefined]):[Promise]<[Object]> | [Object]#Функция, которая будет обрабатывать закрытие WebSocket. Получает опциональный код закрытия и опциональную причину закрытия.
onMessage
Добавлено в: v1.48Этот метод позволяет обрабатывать сообщения, отправляемые через WebSocket, будь то со страницы или с сервера.
Когда вызывается на оригинальном маршруте WebSocket, этот метод обрабатывает сообщения, отправленные со страницы. Вы можете обрабатывать эти сообщения, отвечая на них с помощью webSocketRoute.send(), пересылая их на серверное соединение, возвращенное webSocketRoute.connectToServer(), или делая что-то еще.
После вызова этого метода сообщения не пересылаются автоматически на сервер или на страницу - вы должны делать это вручную, вызывая webSocketRoute.send(). Смотрите примеры в начале для более подробной информации.
Повторный вызов этого метода заменит обработчик на новый.
Использование
webSocketRoute.onMessage(handler);
Аргументы
-
handler
[function]([string]):[Promise]<[Object]> | [Object]#Функция, которая будет обрабатывать сообщения.
send
Добавлено в: v1.48Отправляет сообщение в WebSocket. Когда вызывается на оригинальном WebSocket, отправляет сообщение на страницу. Когда вызывается на результате webSocketRoute.connectToServer(), отправляет сообщение на сервер. Смотрите примеры в начале для более подробной информации.
Использование
webSocketRoute.send(message);
Аргументы
-
message
[string] | [Buffer]#Сообщение для отправки.
url
Добавлено в: v1.48URL WebSocket, созданного на странице.
Использование
webSocketRoute.url();
Возвращает
- [string]#