WebSocketRoute
Когда маршрут WebSocket
настроен с помощью page.route_web_socket() или browser_context.route_web_socket(), объект WebSocketRoute
позволяет обрабатывать WebSocket, как это делает реальный сервер.
Мокирование
По умолчанию маршрутизированный WebSocket не подключается к серверу. Таким образом, вы можете имитировать всю коммуникацию через WebSocket. Вот пример, который отвечает на "request"
с "response"
.
- Sync
- Async
def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
if message == "request":
ws.send("response")
page.route_web_socket("wss://example.com/ws", lambda ws: ws.on_message(
lambda message: message_handler(ws, message)
))
def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
if message == "request":
ws.send("response")
await page.route_web_socket("wss://example.com/ws", lambda ws: ws.on_message(
lambda message: message_handler(ws, message)
))
Поскольку мы не вызываем web_socket_route.connect_to_server внутри обработчика маршрута WebSocket, Playwright предполагает, что WebSocket будет имитирован, и автоматически открывает WebSocket внутри страницы.
Вот еще один пример, который обрабатывает JSON-сообщения:
- Sync
- Async
def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
json_message = json.loads(message)
if json_message["request"] == "question":
ws.send(json.dumps({ "response": "answer" }))
page.route_web_socket("wss://example.com/ws", lambda ws: ws.on_message(
lambda message: message_handler(ws, message)
))
def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
json_message = json.loads(message)
if json_message["request"] == "question":
ws.send(json.dumps({ "response": "answer" }))
await page.route_web_socket("wss://example.com/ws", lambda ws: ws.on_message(
lambda message: message_handler(ws, message)
))
Перехват
В качестве альтернативы, вы можете подключиться к реальному серверу, но перехватывать сообщения между ними и изменять или блокировать их. Вызов web_socket_route.connect_to_server возвращает серверный экземпляр WebSocketRoute
, к которому вы можете отправлять сообщения или обрабатывать входящие сообщения.
Ниже приведен пример, который изменяет некоторые сообщения, отправляемые страницей на сервер. Сообщения, отправляемые с сервера на страницу, остаются нетронутыми, полагаясь на стандартную пересылку.
- Sync
- Async
def message_handler(server: WebSocketRoute, message: Union[str, bytes]):
if message == "request":
server.send("request2")
else:
server.send(message)
def handler(ws: WebSocketRoute):
server = ws.connect_to_server()
ws.on_message(lambda message: message_handler(server, message))
page.route_web_socket("/ws", handler)
def message_handler(server: WebSocketRoute, message: Union[str, bytes]):
if message == "request":
server.send("request2")
else:
server.send(message)
def handler(ws: WebSocketRoute):
server = ws.connect_to_server()
ws.on_message(lambda message: message_handler(server, message))
await page.route_web_socket("/ws", handler)
После подключения к серверу все сообщения пересылаются между страницей и сервером по умолчанию.
Однако, если вы вызываете web_socket_route.on_message() на оригинальном маршруте, сообщения от страницы к серверу больше не будут пересылаться, но должны обрабатываться обработчиком.
Аналогично, вызов web_socket_route.on_message() на серверном WebSocket прекратит пересылку сообщений от сервера к странице, и обработчик должен позаботиться о них.
Следующий пример блокирует некоторые сообщения в обоих направлениях. Поскольку он вызывает web_socket_route.on_message() в обоих направлениях, автоматической пересылки вообще нет.
- Sync
- Async
def ws_message_handler(server: WebSocketRoute, message: Union[str, bytes]):
if message != "blocked-from-the-page":
server.send(message)
def server_message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
if message != "blocked-from-the-server":
ws.send(message)
def handler(ws: WebSocketRoute):
server = ws.connect_to_server()
ws.on_message(lambda message: ws_message_handler(server, message))
server.on_message(lambda message: server_message_handler(ws, message))
page.route_web_socket("/ws", handler)
def ws_message_handler(server: WebSocketRoute, message: Union[str, bytes]):
if message != "blocked-from-the-page":
server.send(message)
def server_message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
if message != "blocked-from-the-server":
ws.send(message)
def handler(ws: WebSocketRoute):
server = ws.connect_to_server()
ws.on_message(lambda message: ws_message_handler(server, message))
server.on_message(lambda message: server_message_handler(ws, message))
await page.route_web_socket("/ws", handler)
Methods
close
Added in: v1.48Закрывает одну сторону WebSocket соединения.
Использование
web_socket_route.close()
web_socket_route.close(**kwargs)
Аргументы
-
Опциональный код закрытия.
-
Опциональная причина закрытия.
Возвращает
on_close
Added in: v1.48Позволяет обрабатывать WebSocket.close
.
По умолчанию, закрытие одной стороны соединения, будь то на странице или на сервере, закроет другую сторону. Однако, когда настроен обработчик web_socket_route.on_close(), стандартная пересылка закрытия отключается, и обработчик должен позаботиться об этом.
Использование
web_socket_route.on_close(handler)
Аргументы
-
handler
Callable[int | [undefined]]:Promise[Any] | Any#Функция, которая будет обрабатывать закрытие WebSocket. Получает опциональный код закрытия и опциональную причину закрытия.
on_message
Added in: v1.48Этот метод позволяет обрабатывать сообщения, которые отправляются через WebSocket, будь то со страницы или с сервера.
Когда вызывается на оригинальном маршруте WebSocket, этот метод обрабатывает сообщения, отправленные со страницы. Вы можете обрабатывать эти сообщения, отвечая на них с помощью web_socket_route.send(), пересылая их на серверное соединение, возвращенное web_socket_route.connect_to_server, или делая что-то еще.
После вызова этого метода сообщения не пересылаются автоматически на сервер или на страницу - вы должны сделать это вручную, вызвав web_socket_route.send(). См. примеры в начале для более подробной информации.
Повторный вызов этого метода заменит обработчик на новый.
Использование
web_socket_route.on_message(handler)
Аргументы
send
Added in: v1.48Отправляет сообщение в WebSocket. Когда вызывается на оригинальном WebSocket, отправляет сообщение на страницу. Когда вызывается на результате web_socket_route.connect_to_server, отправляет сообщение на сервер. См. примеры в начале для более подробной информации.
Использование
web_socket_route.send(message)
Аргументы
Properties
connect_to_server
Added in: v1.48По умолчанию маршрутизированный WebSocket не подключается к серверу, поэтому вы можете имитировать всю коммуникацию через WebSocket. Этот метод подключается к реальному серверу WebSocket и возвращает серверный экземпляр WebSocketRoute, предоставляя возможность отправлять и получать сообщения с сервера.
После подключения к серверу:
- Сообщения, полученные с сервера, будут автоматически пересылаться в WebSocket на странице, если только web_socket_route.on_message() не вызван на серверной стороне
WebSocketRoute
. - Сообщения, отправленные вызовом
WebSocket.send()
на странице, будут автоматически пересылаться на сервер, если только web_socket_route.on_message() не вызван на оригинальномWebSocketRoute
.
См. примеры в начале для более подробной информации.
Использование
web_socket_route.connect_to_server
Возвращает
url
Added in: v1.48URL WebSocket, созданного на странице.
Использование
web_socket_route.url
Возвращает