6262 TimeoutSettings ,
6363 URLMatch ,
6464 URLMatcher ,
65+ WebSocketRouteHandlerCallback ,
6566 async_readfile ,
6667 async_writefile ,
6768 locals_to_params ,
6869 parse_error ,
6970 prepare_record_har_options ,
7071 to_impl ,
7172)
72- from playwright ._impl ._network import Request , Response , Route , serialize_headers
73+ from playwright ._impl ._network import (
74+ Request ,
75+ Response ,
76+ Route ,
77+ WebSocketRoute ,
78+ WebSocketRouteHandler ,
79+ serialize_headers ,
80+ )
7381from playwright ._impl ._page import BindingCall , Page , Worker
7482from playwright ._impl ._str_utils import escape_regex_flags
7583from playwright ._impl ._tracing import Tracing
@@ -106,6 +114,7 @@ def __init__(
106114 self ._browser ._contexts .append (self )
107115 self ._pages : List [Page ] = []
108116 self ._routes : List [RouteHandler ] = []
117+ self ._web_socket_routes : List [WebSocketRouteHandler ] = []
109118 self ._bindings : Dict [str , Any ] = {}
110119 self ._timeout_settings = TimeoutSettings (None )
111120 self ._owner_page : Optional [Page ] = None
@@ -132,7 +141,14 @@ def __init__(
132141 )
133142 ),
134143 )
135-
144+ self ._channel .on (
145+ "webSocketRoute" ,
146+ lambda params : self ._loop .create_task (
147+ self ._on_web_socket_route (
148+ from_channel (params ["webSocketRoute" ]),
149+ )
150+ ),
151+ )
136152 self ._channel .on (
137153 "backgroundPage" ,
138154 lambda params : self ._on_background_page (from_channel (params ["page" ])),
@@ -244,10 +260,24 @@ async def _on_route(self, route: Route) -> None:
244260 try :
245261 # If the page is closed or unrouteAll() was called without waiting and interception disabled,
246262 # the method will throw an error - silence it.
247- await route ._internal_continue ( is_internal = True )
263+ await route ._inner_continue ( True )
248264 except Exception :
249265 pass
250266
267+ async def _on_web_socket_route (self , web_socket_route : WebSocketRoute ) -> None :
268+ route_handler = next (
269+ (
270+ route_handler
271+ for route_handler in self ._web_socket_routes
272+ if route_handler .matches (web_socket_route .url )
273+ ),
274+ None ,
275+ )
276+ if route_handler :
277+ await route_handler .handle (web_socket_route )
278+ else :
279+ web_socket_route .connect_to_server ()
280+
251281 def _on_binding (self , binding_call : BindingCall ) -> None :
252282 func = self ._bindings .get (binding_call ._initializer ["name" ])
253283 if func is None :
@@ -418,6 +448,17 @@ async def _unroute_internal(
418448 return
419449 await asyncio .gather (* map (lambda router : router .stop (behavior ), removed )) # type: ignore
420450
451+ async def route_web_socket (
452+ self , url : URLMatch , handler : WebSocketRouteHandlerCallback
453+ ) -> None :
454+ self ._web_socket_routes .insert (
455+ 0 ,
456+ WebSocketRouteHandler (
457+ URLMatcher (self ._options .get ("baseURL" ), url ), handler
458+ ),
459+ )
460+ await self ._update_web_socket_interception_patterns ()
461+
421462 def _dispose_har_routers (self ) -> None :
422463 for router in self ._har_routers :
423464 router .dispose ()
@@ -488,6 +529,14 @@ async def _update_interception_patterns(self) -> None:
488529 "setNetworkInterceptionPatterns" , {"patterns" : patterns }
489530 )
490531
532+ async def _update_web_socket_interception_patterns (self ) -> None :
533+ patterns = WebSocketRouteHandler .prepare_interception_patterns (
534+ self ._web_socket_routes
535+ )
536+ await self ._channel .send (
537+ "setWebSocketInterceptionPatterns" , {"patterns" : patterns }
538+ )
539+
491540 def expect_event (
492541 self ,
493542 event : str ,
0 commit comments