Skip to content

Commit a8dd1fe

Browse files
committed
Move from trio to threading
1 parent 46253bc commit a8dd1fe

File tree

4 files changed

+61
-88
lines changed

4 files changed

+61
-88
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,13 @@ class Network:
201201
def __init__(self, conn):
202202
self.conn = conn
203203

204-
async def add_intercept(self, params: AddInterceptParameters):
205-
result = await self.conn.execute(AddIntercept(params).cmd())
204+
def add_intercept(self, params: AddInterceptParameters):
205+
result = self.conn.execute(AddIntercept(params).cmd())
206206
return result
207207

208-
async def continue_request(self, params: ContinueRequestParameters):
209-
result = await self.conn.execute(ContinueRequest(params).cmd())
208+
def continue_request(self, params: ContinueRequestParameters):
209+
result = self.conn.execute(ContinueRequest(params).cmd())
210210
return result
211211

212-
async def remove_intercept(self, params: RemoveInterceptParameters):
213-
await self.conn.execute(RemoveIntercept(params).cmd())
212+
def remove_intercept(self, params: RemoveInterceptParameters):
213+
self.conn.execute(RemoveIntercept(params).cmd())

py/selenium/webdriver/remote/network.py

Lines changed: 30 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,10 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717
from collections import defaultdict
18-
from contextlib import asynccontextmanager
19-
20-
import trio
2118

2219
from selenium.webdriver.common.bidi import network
2320
from selenium.webdriver.common.bidi.browsing_context import Navigate
2421
from selenium.webdriver.common.bidi.browsing_context import NavigateParameters
25-
from selenium.webdriver.common.bidi.cdp import open_cdp
2622
from selenium.webdriver.common.bidi.network import AddInterceptParameters
2723
from selenium.webdriver.common.bidi.network import BeforeRequestSent
2824
from selenium.webdriver.common.bidi.network import BeforeRequestSentParameters
@@ -32,68 +28,46 @@
3228

3329

3430
class Network:
35-
def __init__(self, driver):
31+
def __init__(self, conn, driver):
32+
self.intercepts = defaultdict(lambda: {"event": None, "handlers": []})
33+
self.callback_ids = {}
3634
self.driver = driver
37-
self.listeners = {}
38-
self.intercepts = defaultdict(lambda: {"event_name": None, "handlers": []})
39-
self.bidi_network = None
40-
self.conn = None
41-
self.nursery = None
35+
self.conn = conn
36+
self.bidi_network = network.Network(self.conn)
4237

4338
self.remove_request_handler = self.remove_intercept
4439
self.clear_request_handlers = self.clear_intercepts
4540

46-
@asynccontextmanager
47-
async def set_context(self):
48-
ws_url = self.driver.caps.get("webSocketUrl")
49-
async with open_cdp(ws_url) as conn:
50-
self.conn = conn
51-
self.bidi_network = network.Network(self.conn)
52-
async with trio.open_nursery() as nursery:
53-
self.nursery = nursery
54-
yield
55-
56-
async def get(self, url, wait="complete"):
41+
def get(self, url, wait="none"):
5742
params = NavigateParameters(context=self.driver.current_window_handle, url=url, wait=wait)
58-
await self.conn.execute(Navigate(params).cmd())
43+
self.conn.execute(Navigate(params).cmd())
5944

60-
async def add_listener(self, event, callback):
61-
event_name = event.event_class
62-
if event_name in self.listeners:
63-
return
64-
self.listeners[event_name] = self.conn.listen(event)
65-
try:
66-
async for event in self.listeners[event_name]:
67-
request_data = event.params
68-
if request_data.isBlocked:
69-
await callback(request_data)
70-
except trio.ClosedResourceError:
71-
pass
72-
73-
async def add_handler(self, event, handler, urlPatterns=None):
45+
def add_handler(self, event, handler, urlPatterns=None):
7446
event_name = event.event_class
7547
phase_name = event_name.split(".")[-1]
7648

77-
await self.conn.execute(session_subscribe(event_name))
49+
self.conn.execute(session_subscribe(event_name))
7850

7951
params = AddInterceptParameters(phases=[phase_name], urlPatterns=urlPatterns)
80-
result = await self.bidi_network.add_intercept(params)
52+
result = self.bidi_network.add_intercept(params)
8153
intercept = result["intercept"]
8254

83-
self.intercepts[intercept]["event_name"] = event_name
55+
self.intercepts[intercept]["event"] = event
8456
self.intercepts[intercept]["handlers"].append(handler)
85-
self.nursery.start_soon(self.add_listener, event, self.handle_events)
57+
if not self.callback_ids.get(event_name):
58+
self.callback_ids[event_name] = self.conn.add_callback(event, self.handle_events)
8659
return intercept
8760

88-
async def add_request_handler(self, handler, urlPatterns=None):
89-
intercept = await self.add_handler(BeforeRequestSent, handler, urlPatterns)
61+
def add_request_handler(self, handler, urlPatterns=None):
62+
intercept = self.add_handler(BeforeRequestSent, handler, urlPatterns)
9063
return intercept
9164

92-
async def handle_events(self, event_params):
93-
if isinstance(event_params, BeforeRequestSentParameters):
65+
def handle_events(self, event):
66+
event_params = event.params
67+
if isinstance(event_params, BeforeRequestSentParameters) and event_params.isBlocked:
9468
json = self.handle_requests(event_params)
9569
params = ContinueRequestParameters(**json)
96-
await self.bidi_network.continue_request(params)
70+
self.bidi_network.continue_request(params)
9771

9872
def handle_requests(self, params):
9973
request = params.request
@@ -102,24 +76,19 @@ def handle_requests(self, params):
10276
request = handler(request)
10377
return request
10478

105-
async def remove_listener(self, event_name):
106-
listener = self.listeners.pop(event_name)
107-
listener.close()
108-
109-
async def remove_intercept(self, intercept):
110-
await self.bidi_network.remove_intercept(
79+
def remove_intercept(self, intercept):
80+
self.bidi_network.remove_intercept(
11181
params=network.RemoveInterceptParameters(intercept),
11282
)
113-
event_name = self.intercepts.pop(intercept)["event_name"]
114-
remaining = [i for i in self.intercepts.values() if i["event_name"] == event_name]
83+
84+
event = self.intercepts.pop(intercept)["event"]
85+
event_name = event.event_class
86+
87+
remaining = [i for i in self.intercepts.values() if i["event"].event_class == event_name]
11588
if len(remaining) == 0:
116-
await self.remove_listener(event_name)
117-
await self.conn.execute(session_unsubscribe(event_name))
89+
self.conn.execute(session_unsubscribe(event_name))
90+
self.conn.remove_callback(event, self.callback_ids[event_name])
11891

119-
async def clear_intercepts(self):
92+
def clear_intercepts(self):
12093
for intercept in self.intercepts:
121-
await self.remove_intercept(intercept)
122-
123-
async def disable_cache(self):
124-
# Bidi 'network.setCacheBehavior' is not implemented in v130
125-
self.driver.execute_cdp_cmd("Network.setCacheDisabled", {"cacheDisabled": True})
94+
self.remove_intercept(intercept)

py/selenium/webdriver/remote/webdriver.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1253,8 +1253,13 @@ def script(self):
12531253

12541254
@property
12551255
def network(self):
1256+
if not self._websocket_connection:
1257+
self._start_bidi()
1258+
12561259
if not self._network:
1257-
self._network = Network(self)
1260+
# Bidi 'network.setCacheBehavior' is not implemented in v130
1261+
self.execute_cdp_cmd("Network.setCacheDisabled", {"cacheDisabled": True})
1262+
self._network = Network(self._websocket_connection, self)
12581263

12591264
return self._network
12601265

py/test/selenium/webdriver/common/bidi_network_tests.py

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
@pytest.mark.xfail_firefox
2323
@pytest.mark.xfail_safari
24-
async def test_request_handler(driver, pages):
24+
def test_request_handler(driver, pages):
2525

2626
url1 = pages.url("simpleTest.html")
2727
url2 = pages.url("clicks.html")
@@ -35,22 +35,21 @@ def request_handler(params):
3535
json = {"request": request, "url": url3}
3636
return json
3737

38-
async with driver.network.set_context():
39-
# Multiple intercepts
40-
intercept1 = await driver.network.add_request_handler(request_handler, pattern1)
41-
intercept2 = await driver.network.add_request_handler(request_handler, pattern2)
42-
await driver.network.get(url1)
43-
assert driver.title == "We Leave From Here"
44-
await driver.network.get(url2)
45-
assert driver.title == "We Leave From Here"
46-
47-
# Removal of a single intercept
48-
await driver.network.remove_intercept(intercept2)
49-
await driver.network.get(url2)
50-
assert driver.title == "clicks"
51-
await driver.network.get(url1)
52-
assert driver.title == "We Leave From Here"
53-
54-
await driver.network.remove_intercept(intercept1)
55-
await driver.network.get(url1)
56-
assert driver.title == "Hello WebDriver"
38+
# Multiple intercepts
39+
intercept1 = driver.network.add_request_handler(request_handler, pattern1)
40+
intercept2 = driver.network.add_request_handler(request_handler, pattern2)
41+
driver.network.get(url1)
42+
assert driver.title == "We Leave From Here"
43+
driver.network.get(url2)
44+
assert driver.title == "We Leave From Here"
45+
46+
# Removal of a single intercept
47+
driver.network.remove_intercept(intercept2)
48+
driver.network.get(url2)
49+
assert driver.title == "clicks"
50+
driver.network.get(url1)
51+
assert driver.title == "We Leave From Here"
52+
53+
driver.network.remove_intercept(intercept1)
54+
driver.network.get(url1)
55+
assert driver.title == "Hello WebDriver"

0 commit comments

Comments
 (0)