Skip to content

Commit edc5665

Browse files
committed
Add non-blocking navigation
1 parent 6925170 commit edc5665

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import re
2+
import typing
3+
from dataclasses import dataclass, fields, is_dataclass
4+
5+
from selenium.webdriver.common.bidi.cdp import import_devtools
6+
7+
devtools = import_devtools("")
8+
event_class = devtools.util.event_class
9+
10+
@dataclass
11+
class NavigateParameters:
12+
context: str
13+
url: str
14+
wait: str = "complete"
15+
16+
def to_json(self):
17+
json = {}
18+
for field in fields(self):
19+
key = field.name
20+
value = getattr(self, key)
21+
if not value:
22+
continue
23+
if is_dataclass(value):
24+
value = value.to_json()
25+
json = json | {re.sub(r"^_", "", key): value}
26+
return json
27+
28+
@classmethod
29+
def from_json(cls, json):
30+
return cls(**json)
31+
32+
@dataclass
33+
class Navigate:
34+
params: NavigateParameters
35+
method: typing.Literal["browsingContext.navigate"] = "browsingContext.navigate"
36+
37+
def to_json(self):
38+
json = {}
39+
for field in fields(self):
40+
key = field.name
41+
value = getattr(self, key)
42+
if not value:
43+
continue
44+
if is_dataclass(value):
45+
value = value.to_json()
46+
json = json | {re.sub(r"^_", "", key): value}
47+
return json
48+
49+
@classmethod
50+
def from_json(cls, json):
51+
return cls(**json)
52+
53+
def cmd(self):
54+
result = yield self.to_json()
55+
return result

py/selenium/webdriver/remote/network.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from dataclasses import fields
22

33
from selenium.webdriver.common.bidi import network
4+
from selenium.webdriver.common.bidi.browsing_context import Navigate, NavigateParameters
45
from selenium.webdriver.common.bidi.network import (
56
AddInterceptParameters,
67
BeforeRequestSent,
@@ -29,6 +30,10 @@ async def add_request_handler(self, request_filter=lambda _: True, handler=defau
2930
await self.network.add_listener(event=BeforeRequestSent, callback=callback)
3031
return intercept
3132

33+
async def get(self, url, conn):
34+
params = NavigateParameters(context=self.driver.current_window_handle, url=url)
35+
await conn.execute(Navigate(params).cmd())
36+
3237
def _callback(self, request_filter, handler):
3338
async def callback(request):
3439
if request_filter(request):

0 commit comments

Comments
 (0)