Skip to content

Commit b022fa0

Browse files
committed
[py] Implement add_request_handler
1 parent 51ce6ac commit b022fa0

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed

py/selenium/webdriver/common/bidi/network.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from dataclasses import dataclass, fields, is_dataclass
44

55
from selenium.webdriver.common.bidi.cdp import import_devtools
6+
from selenium.webdriver.common.bidi.session import session_subscribe
67

78
from . import script
89

@@ -489,3 +490,27 @@ def cmd(self):
489490
result = yield self.to_json()
490491
return result
491492

493+
494+
class Network:
495+
def __init__(self, conn):
496+
497+
self.conn = conn
498+
self.callbacks = {}
499+
500+
async def add_intercept(self, event, params: AddInterceptParameters):
501+
await self.bidi.execute(session_subscribe(event.event_class))
502+
result = await self.bidi.execute(AddIntercept(params).cmd())
503+
return result
504+
505+
async def add_listener(self, event, callback):
506+
listener = self.bidi.listen(event)
507+
508+
async for event in listener:
509+
request_data = BeforeRequestSentParameters.from_json(
510+
event.to_json()["params"]
511+
)
512+
await callback(request_data)
513+
514+
async def continue_request(self, params: ContinueRequestParameters):
515+
result = await self.bidi.execute(ContinueRequest(params).cmd())
516+
return result
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from dataclasses import fields
2+
3+
from selenium.webdriver.common.bidi import network
4+
from selenium.webdriver.common.bidi.cdp import open_cdp
5+
from selenium.webdriver.common.bidi.network import (
6+
AddInterceptParameters,
7+
BeforeRequestSent,
8+
BeforeRequestSentParameters,
9+
ContinueRequestParameters,
10+
)
11+
12+
13+
def default_request_handler(params: BeforeRequestSentParameters):
14+
return ContinueRequestParameters(request=params.request["request"])
15+
16+
17+
class Network:
18+
def __init__(self, ws_url):
19+
self.ws_url = ws_url
20+
self.network = None
21+
22+
async def add_request_handler(self, request_filter=lambda _: True, handler=default_request_handler):
23+
async with open_cdp(self.ws_url) as conn:
24+
if not self.network:
25+
self.network = network.Network(conn)
26+
params = AddInterceptParameters(["beforeRequestSent"])
27+
result = await self.network.add_intercept(event=BeforeRequestSent, params=params)
28+
intercept = result["intercept"]
29+
callback = self._callback(request_filter, handler)
30+
await self.network.add_listener(BeforeRequestSent, callback)
31+
return intercept
32+
33+
def _callback(self, request_filter, handler):
34+
async def callback(request):
35+
if request_filter(request):
36+
request = handler(request)
37+
else:
38+
request = default_request_handler(request)
39+
await self.network.continue_request(request)
40+
41+
return callback

py/selenium/webdriver/remote/webdriver.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
from selenium.webdriver.common.virtual_authenticator import (
5252
required_virtual_authenticator,
5353
)
54+
from selenium.webdriver.remote.network import Network
5455
from selenium.webdriver.support.relative_locator import RelativeBy
5556

5657
from .bidi_connection import BidiConnection
@@ -213,6 +214,7 @@ def __init__(
213214

214215
self._websocket_connection = None
215216
self._script = None
217+
self._network = None
216218

217219
def __repr__(self):
218220
return f'<{type(self).__module__}.{type(self).__name__} (session="{self.session_id}")>'
@@ -1080,6 +1082,13 @@ def script(self):
10801082

10811083
return self._script
10821084

1085+
@property
1086+
def network(self):
1087+
if not self._network:
1088+
self._network = Network(self.caps.get("webSocketUrl"))
1089+
1090+
return self._network
1091+
10831092
def _start_bidi(self):
10841093
if self.caps.get("webSocketUrl"):
10851094
ws_url = self.caps.get("webSocketUrl")

0 commit comments

Comments
 (0)