Skip to content

Commit 30caa81

Browse files
authored
Merge pull request #3295 from seleniumbase/cdp-mode-patch-13
CDP Mode - Patch 13
2 parents d8d02cd + c666b7a commit 30caa81

15 files changed

+124
-31
lines changed

examples/cdp_mode/ReadMe.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ with SB(uc=True, test=True, locale_code="en", ad_block=True) as sb:
143143
sb.sleep(3)
144144
location = "Anaheim, CA, USA"
145145
sb.cdp.press_keys("input#searchbox", location)
146-
sb.sleep(1)
146+
sb.sleep(2)
147147
sb.cdp.click("div#suggestion-list ul li a")
148148
sb.sleep(1)
149149
sb.cdp.click('div.hotel-card-footer button')

examples/cdp_mode/raw_easyjet.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
sb.sleep(1.2)
2121
sb.cdp.click('input[name="when"]')
2222
sb.sleep(1.2)
23-
sb.cdp.click('[data-testid="month"] button[aria-disabled="false"]')
23+
sb.cdp.click('[data-testid="month"]:last-of-type [aria-disabled="false"]')
2424
sb.sleep(1.2)
2525
sb.cdp.click('[data-testid="month"]:last-of-type [aria-disabled="false"]')
2626
sb.sleep(1.2)

examples/cdp_mode/raw_hyatt.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
sb.sleep(3)
1313
location = "Anaheim, CA, USA"
1414
sb.cdp.press_keys("input#searchbox", location)
15-
sb.sleep(1)
15+
sb.sleep(2)
1616
sb.cdp.click("div#suggestion-list ul li a")
1717
sb.sleep(1)
1818
sb.cdp.click('div.hotel-card-footer button')

examples/cdp_mode/raw_southwest.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@
77
origin = "DEN"
88
destination = "PHX"
99
sb.cdp.gui_click_element("input#originationAirportCode")
10-
sb.sleep(0.2)
10+
sb.sleep(0.5)
11+
sb.uc_gui_press_keys(" " + "\n")
12+
sb.sleep(0.5)
13+
sb.cdp.gui_click_element("input#originationAirportCode")
14+
sb.sleep(0.5)
1115
sb.uc_gui_press_keys(origin + "\n")
1216
sb.sleep(0.5)
1317
sb.cdp.gui_click_element("h1.heading")
1418
sb.sleep(0.5)
1519
sb.cdp.gui_click_element("input#destinationAirportCode")
16-
sb.sleep(0.2)
20+
sb.sleep(0.5)
1721
sb.uc_gui_press_keys(destination + "\n")
1822
sb.sleep(0.5)
1923
sb.cdp.gui_click_element("h1.heading")

help_docs/method_summary.md

+6
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ self.get_gui_element_rect(selector, by="css selector")
231231

232232
self.get_gui_element_center(selector, by="css selector")
233233

234+
self.get_screen_rect()
235+
234236
self.get_window_rect()
235237

236238
self.get_window_size()
@@ -245,6 +247,10 @@ self.set_window_position(x, y)
245247

246248
self.maximize_window()
247249

250+
self.minimize_window()
251+
252+
self.reset_window_size()
253+
248254
self.switch_to_frame(frame="iframe", timeout=None)
249255

250256
self.switch_to_default_content()

mkdocs_build/requirements.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
regex>=2024.11.6
55
pymdown-extensions>=10.12
6-
pipdeptree>=2.23.4
6+
pipdeptree>=2.24.0
77
python-dateutil>=2.8.2
88
Markdown==3.7
99
markdown2==2.5.1
@@ -20,7 +20,7 @@ lxml==5.3.0
2020
pyquery==2.0.1
2121
readtime==3.0.0
2222
mkdocs==1.6.1
23-
mkdocs-material==9.5.44
23+
mkdocs-material==9.5.46
2424
mkdocs-exclude-search==0.6.6
2525
mkdocs-simple-hooks==0.1.5
2626
mkdocs-material-extensions==1.3.1

requirements.txt

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
pip>=24.3.1
22
packaging>=24.2
33
setuptools~=70.2;python_version<"3.10"
4-
setuptools>=75.5.0;python_version>="3.10"
5-
wheel>=0.45.0
4+
setuptools>=75.6.0;python_version>="3.10"
5+
wheel>=0.45.1
66
attrs>=24.2.0
77
certifi>=2024.8.30
88
exceptiongroup>=1.2.2
@@ -37,7 +37,7 @@ trio==0.27.0
3737
trio-websocket==0.11.1
3838
wsproto==1.2.0
3939
websocket-client==1.8.0
40-
selenium==4.26.1
40+
selenium==4.27.1
4141
cssselect==1.2.0
4242
sortedcontainers==2.4.0
4343
execnet==2.1.1
@@ -48,7 +48,8 @@ pytest==8.3.3
4848
pytest-html==2.0.1
4949
pytest-metadata==3.1.1
5050
pytest-ordering==0.6
51-
pytest-rerunfailures==14.0
51+
pytest-rerunfailures==14.0;python_version<"3.9"
52+
pytest-rerunfailures==15.0;python_version>="3.9"
5253
pytest-xdist==3.6.1
5354
parameterized==0.9.0
5455
behave==1.2.6
@@ -64,7 +65,7 @@ rich==13.9.4
6465
# ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
6566

6667
coverage>=7.6.1;python_version<"3.9"
67-
coverage>=7.6.7;python_version>="3.9"
68+
coverage>=7.6.8;python_version>="3.9"
6869
pytest-cov>=5.0.0;python_version<"3.9"
6970
pytest-cov>=6.0.0;python_version>="3.9"
7071
flake8==5.0.4;python_version<"3.9"

seleniumbase/__version__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.32.12"
2+
__version__ = "4.33.0"

seleniumbase/core/browser_launcher.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,10 @@ def extend_driver(driver):
216216
driver.get_text = DM.get_text
217217
driver.get_active_element_css = DM.get_active_element_css
218218
driver.get_locale_code = DM.get_locale_code
219+
driver.get_screen_rect = DM.get_screen_rect
219220
driver.get_origin = DM.get_origin
220221
driver.get_user_agent = DM.get_user_agent
222+
driver.get_cookie_string = DM.get_cookie_string
221223
driver.highlight = DM.highlight
222224
driver.highlight_click = DM.highlight_click
223225
driver.highlight_if_visible = DM.highlight_if_visible
@@ -234,6 +236,7 @@ def extend_driver(driver):
234236
driver.switch_to_window = DM.switch_to_window
235237
driver.switch_to_tab = DM.switch_to_tab
236238
driver.switch_to_frame = DM.switch_to_frame
239+
driver.reset_window_size = DM.reset_window_size
237240
if hasattr(driver, "proxy"):
238241
driver.set_wire_proxy = DM.set_wire_proxy
239242
return driver
@@ -2447,10 +2450,8 @@ def _set_firefox_options(
24472450
firefox_arg_list = firefox_arg.split(",")
24482451
for firefox_arg_item in firefox_arg_list:
24492452
firefox_arg_item = firefox_arg_item.strip()
2450-
if not firefox_arg_item.startswith("--"):
2451-
if firefox_arg_item.startswith("-"):
2452-
firefox_arg_item = "-" + firefox_arg_item
2453-
else:
2453+
if not firefox_arg_item.startswith("-"):
2454+
if firefox_arg_item.count(os.sep) == 0:
24542455
firefox_arg_item = "--" + firefox_arg_item
24552456
if len(firefox_arg_item) >= 3:
24562457
options.add_argument(firefox_arg_item)

seleniumbase/core/sb_cdp.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ def click_visible_elements(self, selector, limit=0):
551551
if (width != 0 or height != 0):
552552
element.click()
553553
click_count += 1
554-
time.sleep(0.042)
554+
time.sleep(0.044)
555555
self.__slow_mode_pause_if_set()
556556
self.loop.run_until_complete(self.page.wait())
557557
except Exception:
@@ -668,10 +668,10 @@ def press_keys(self, selector, text, timeout=settings.SMALL_TIMEOUT):
668668
text = text[:-1]
669669
for key in text:
670670
element.send_keys(key)
671-
time.sleep(0.042)
671+
time.sleep(0.044)
672672
if submit:
673673
element.send_keys("\r\n")
674-
time.sleep(0.042)
674+
time.sleep(0.044)
675675
self.__slow_mode_pause_if_set()
676676
self.loop.run_until_complete(self.page.wait())
677677

@@ -741,7 +741,7 @@ def maximize(self):
741741
return
742742
elif self.get_window()[1].window_state.value == "minimized":
743743
self.loop.run_until_complete(self.page.maximize())
744-
time.sleep(0.042)
744+
time.sleep(0.044)
745745
return self.loop.run_until_complete(self.page.maximize())
746746

747747
def minimize(self):
@@ -751,7 +751,7 @@ def minimize(self):
751751
def medimize(self):
752752
if self.get_window()[1].window_state.value == "minimized":
753753
self.loop.run_until_complete(self.page.medimize())
754-
time.sleep(0.042)
754+
time.sleep(0.044)
755755
return self.loop.run_until_complete(self.page.medimize())
756756

757757
def set_window_rect(self, x, y, width, height):
@@ -760,7 +760,7 @@ def set_window_rect(self, x, y, width, height):
760760
self.page.set_window_size(
761761
left=x, top=y, width=width, height=height)
762762
)
763-
time.sleep(0.042)
763+
time.sleep(0.044)
764764
return self.loop.run_until_complete(
765765
self.page.set_window_size(
766766
left=x, top=y, width=width, height=height)
@@ -1125,7 +1125,7 @@ def gui_press_key(self, key):
11251125
)
11261126
with gui_lock:
11271127
pyautogui.press(key)
1128-
time.sleep(0.042)
1128+
time.sleep(0.044)
11291129
self.__slow_mode_pause_if_set()
11301130
self.loop.run_until_complete(self.page.wait())
11311131

@@ -1139,7 +1139,7 @@ def gui_press_keys(self, keys):
11391139
with gui_lock:
11401140
for key in keys:
11411141
pyautogui.press(key)
1142-
time.sleep(0.042)
1142+
time.sleep(0.044)
11431143
self.__slow_mode_pause_if_set()
11441144
self.loop.run_until_complete(self.page.wait())
11451145

seleniumbase/core/sb_driver.py

+31
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Add new methods to extend the driver"""
22
from contextlib import suppress
33
from selenium.webdriver.remote.webelement import WebElement
4+
from seleniumbase.config import settings
45
from seleniumbase.fixtures import js_utils
56
from seleniumbase.fixtures import page_actions
67
from seleniumbase.fixtures import page_utils
@@ -189,6 +190,8 @@ def is_alert_present(self):
189190
return False
190191

191192
def is_online(self):
193+
if self.__is_cdp_swap_needed():
194+
return self.driver.cdp.evaluate("navigator.onLine;")
192195
return self.driver.execute_script("return navigator.onLine;")
193196

194197
def is_connected(self):
@@ -231,17 +234,35 @@ def get_text(self, *args, **kwargs):
231234
return page_actions.get_text(self.driver, *args, **kwargs)
232235

233236
def get_active_element_css(self, *args, **kwargs):
237+
if self.__is_cdp_swap_needed():
238+
return self.driver.cdp.get_active_element_css()
234239
return js_utils.get_active_element_css(self.driver, *args, **kwargs)
235240

236241
def get_locale_code(self, *args, **kwargs):
242+
if self.__is_cdp_swap_needed():
243+
return self.driver.cdp.get_locale_code()
237244
return js_utils.get_locale_code(self.driver, *args, **kwargs)
238245

246+
def get_screen_rect(self, *args, **kwargs):
247+
if self.__is_cdp_swap_needed():
248+
return self.driver.cdp.get_screen_rect()
249+
return js_utils.get_screen_rect(self.driver, *args, **kwargs)
250+
239251
def get_origin(self, *args, **kwargs):
252+
if self.__is_cdp_swap_needed():
253+
return self.driver.cdp.get_origin()
240254
return js_utils.get_origin(self.driver, *args, **kwargs)
241255

242256
def get_user_agent(self, *args, **kwargs):
257+
if self.__is_cdp_swap_needed():
258+
return self.driver.cdp.get_user_agent()
243259
return js_utils.get_user_agent(self.driver, *args, **kwargs)
244260

261+
def get_cookie_string(self, *args, **kwargs):
262+
if self.__is_cdp_swap_needed():
263+
return self.driver.cdp.get_cookie_string()
264+
return js_utils.get_cookie_string(self.driver, *args, **kwargs)
265+
245266
def highlight(self, *args, **kwargs):
246267
if self.__is_cdp_swap_needed():
247268
selector = None
@@ -312,6 +333,16 @@ def switch_to_frame(self, frame="iframe"):
312333
iframe = self.locator(frame)
313334
self.driver.switch_to.frame(iframe)
314335

336+
def reset_window_size(self):
337+
if self.__is_cdp_swap_needed():
338+
self.driver.cdp.reset_window_size()
339+
return
340+
x = settings.WINDOW_START_X
341+
y = settings.WINDOW_START_Y
342+
width = settings.CHROME_START_WIDTH
343+
height = settings.CHROME_START_HEIGHT
344+
self.driver.set_window_rect(x, y, width, height)
345+
315346
def set_wire_proxy(self, string):
316347
"""Set a proxy server for selenium-wire mode ("--wire")
317348
Examples: (ONLY avilable if using selenium-wire mode!)

seleniumbase/fixtures/base_case.py

+35
Original file line numberDiff line numberDiff line change
@@ -3452,6 +3452,13 @@ def get_gui_element_center(self, selector, by="css selector"):
34523452
y = element_rect["y"] + (element_rect["height"] / 2.0) + 0.5
34533453
return (x, y)
34543454

3455+
def get_screen_rect(self):
3456+
self.__check_scope()
3457+
if self.__is_cdp_swap_needed():
3458+
return self.cdp.get_screen_rect()
3459+
self._check_browser()
3460+
return self.driver.get_screen_rect()
3461+
34553462
def get_window_rect(self):
34563463
self.__check_scope()
34573464
if self.__is_cdp_swap_needed():
@@ -3475,6 +3482,9 @@ def get_window_position(self):
34753482

34763483
def set_window_rect(self, x, y, width, height):
34773484
self.__check_scope()
3485+
if self.__is_cdp_swap_needed():
3486+
self.cdp.set_window_rect(x, y, width, height)
3487+
return
34783488
self._check_browser()
34793489
self.driver.set_window_rect(x, y, width, height)
34803490
self.__demo_mode_pause_if_active(tiny=True)
@@ -3493,10 +3503,35 @@ def set_window_position(self, x, y):
34933503

34943504
def maximize_window(self):
34953505
self.__check_scope()
3506+
if self.__is_cdp_swap_needed():
3507+
self.cdp.maximize()
3508+
return
34963509
self._check_browser()
34973510
self.driver.maximize_window()
34983511
self.__demo_mode_pause_if_active(tiny=True)
34993512

3513+
def minimize_window(self):
3514+
self.__check_scope()
3515+
if self.__is_cdp_swap_needed():
3516+
self.cdp.minimize()
3517+
return
3518+
self._check_browser()
3519+
self.driver.minimize_window()
3520+
self.__demo_mode_pause_if_active(tiny=True)
3521+
3522+
def reset_window_size(self):
3523+
self.__check_scope()
3524+
if self.__is_cdp_swap_needed():
3525+
self.cdp.reset_window_size()
3526+
return
3527+
self._check_browser()
3528+
x = settings.WINDOW_START_X
3529+
y = settings.WINDOW_START_Y
3530+
width = settings.CHROME_START_WIDTH
3531+
height = settings.CHROME_START_HEIGHT
3532+
self.set_window_rect(x, y, width, height)
3533+
self.__demo_mode_pause_if_active(tiny=True)
3534+
35003535
def switch_to_frame(self, frame="iframe", timeout=None):
35013536
"""Wait for an iframe to appear, and switch to it. This should be
35023537
usable as a drop-in replacement for driver.switch_to.frame().

seleniumbase/fixtures/js_utils.py

+8
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,10 @@ def get_locale_code(driver):
11881188
return driver.execute_script(script)
11891189

11901190

1191+
def get_screen_rect(driver):
1192+
return driver.execute_script("return window.screen;")
1193+
1194+
11911195
def get_origin(driver):
11921196
return driver.execute_script("return window.location.origin;")
11931197

@@ -1196,6 +1200,10 @@ def get_user_agent(driver):
11961200
return driver.execute_script("return navigator.userAgent;")
11971201

11981202

1203+
def get_cookie_string(driver):
1204+
return driver.execute_script("return document.cookie;")
1205+
1206+
11991207
def get_scroll_distance_to_element(driver, element):
12001208
try:
12011209
scroll_position = driver.execute_script("return window.scrollY;")

0 commit comments

Comments
 (0)