Skip to content

Commit 44ba6a0

Browse files
authored
Merge pull request #3250 from seleniumbase/cdp-mode-patch-8
CDP Mode - Patch 8
2 parents 7fadabd + 4f86de9 commit 44ba6a0

File tree

10 files changed

+78
-13
lines changed

10 files changed

+78
-13
lines changed

examples/cdp_mode/ReadMe.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,12 +364,19 @@ sb.cdp.get_gui_element_center(selector)
364364
sb.cdp.get_document()
365365
sb.cdp.get_flattened_document()
366366
sb.cdp.get_element_attributes(selector)
367+
sb.cdp.get_element_attribute(selector, attribute)
367368
sb.cdp.get_element_html(selector)
368369
sb.cdp.set_locale(locale)
369370
sb.cdp.set_attributes(selector, attribute, value)
370371
sb.cdp.gui_click_x_y(x, y)
371372
sb.cdp.gui_click_element(selector)
372373
sb.cdp.internalize_links()
374+
sb.cdp.is_checked(selector)
375+
sb.cdp.is_selected(selector)
376+
sb.cdp.check_if_unchecked(selector)
377+
sb.cdp.select_if_unselected(selector)
378+
sb.cdp.uncheck_if_checked(selector)
379+
sb.cdp.unselect_if_selected(selector)
373380
sb.cdp.is_element_present(selector)
374381
sb.cdp.is_element_visible(selector)
375382
sb.cdp.assert_element(selector)

examples/cdp_mode/raw_planetmc.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from seleniumbase import SB
2+
3+
with SB(uc=True, test=True, locale_code="en") as sb:
4+
url = "www.planetminecraft.com/account/sign_in/"
5+
sb.activate_cdp_mode(url)
6+
sb.sleep(1)
7+
sb.cdp.gui_click_element("#turnstile-widget")
8+
sb.sleep(2)

examples/cdp_mode/raw_wsform.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from seleniumbase import SB
2+
3+
with SB(uc=True, test=True, locale_code="en") as sb:
4+
url = "https://wsform.com/demo/"
5+
sb.activate_cdp_mode(url)
6+
sb.scroll_into_view("div.grid")
7+
sb.uc_gui_click_captcha()
8+
sb.sleep(1)

mkdocs_build/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# mkdocs dependencies for generating the seleniumbase.io website
22
# Minimum Python version: 3.9 (for generating docs only)
33

4-
regex>=2024.9.11
4+
regex>=2024.11.6
55
pymdown-extensions>=10.12
66
pipdeptree>=2.23.4
77
python-dateutil>=2.8.2

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pyyaml>=6.0.2
2222
pygments>=2.18.0
2323
pyreadline3>=3.5.3;platform_system=="Windows"
2424
tabcompleter>=1.4.0
25-
pdbp>=1.6.0
25+
pdbp>=1.6.1
2626
idna==3.10
2727
chardet==5.2.0
2828
charset-normalizer==3.4.0

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.32.7"
2+
__version__ = "4.32.8"

seleniumbase/core/browser_launcher.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,7 @@ def uc_open_with_cdp_mode(driver, url=None):
625625
cdp.internalize_links = CDPM.internalize_links
626626
cdp.get_window = CDPM.get_window
627627
cdp.get_element_attributes = CDPM.get_element_attributes
628+
cdp.get_element_attribute = CDPM.get_element_attribute
628629
cdp.get_element_html = CDPM.get_element_html
629630
cdp.get_element_rect = CDPM.get_element_rect
630631
cdp.get_element_size = CDPM.get_element_size
@@ -651,6 +652,11 @@ def uc_open_with_cdp_mode(driver, url=None):
651652
cdp.focus = CDPM.focus
652653
cdp.highlight_overlay = CDPM.highlight_overlay
653654
cdp.get_window_position = CDPM.get_window_position
655+
cdp.check_if_unchecked = CDPM.check_if_unchecked
656+
cdp.uncheck_if_checked = CDPM.uncheck_if_checked
657+
cdp.select_if_unselected = CDPM.select_if_unselected
658+
cdp.unselect_if_selected = CDPM.unselect_if_selected
659+
cdp.is_checked = CDPM.is_checked
654660
cdp.is_element_present = CDPM.is_element_present
655661
cdp.is_element_visible = CDPM.is_element_visible
656662
cdp.assert_element_present = CDPM.assert_element_present

seleniumbase/core/sb_cdp.py

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""Add CDP methods to extend the driver"""
22
import fasteners
3-
import math
43
import os
54
import re
65
import sys
@@ -771,10 +770,12 @@ def get_gui_element_rect(self, selector):
771770
window_rect = self.get_window_rect()
772771
w_bottom_y = window_rect["y"] + window_rect["height"]
773772
viewport_height = window_rect["innerHeight"]
774-
x = math.ceil(window_rect["x"] + element_rect["x"])
775-
y = math.ceil(w_bottom_y - viewport_height + element_rect["y"])
773+
x = window_rect["x"] + element_rect["x"]
774+
y = w_bottom_y - viewport_height + element_rect["y"]
776775
y_scroll_offset = window_rect["pageYOffset"]
777-
y = int(y - y_scroll_offset)
776+
y = y - y_scroll_offset
777+
x = x + window_rect["scrollX"]
778+
y = y + window_rect["scrollY"]
778779
return ({"height": e_height, "width": e_width, "x": x, "y": y})
779780

780781
def get_gui_element_center(self, selector):
@@ -804,6 +805,10 @@ def get_element_attributes(self, selector):
804805
)
805806
)
806807

808+
def get_element_attribute(self, selector, attribute):
809+
attributes = self.get_element_attributes(selector)
810+
return attributes[attribute]
811+
807812
def get_element_html(self, selector):
808813
selector = self.__convert_to_css_if_xpath(selector)
809814
return self.loop.run_until_complete(
@@ -1033,6 +1038,28 @@ def internalize_links(self):
10331038
This prevents those links from opening in a new tab."""
10341039
self.set_attributes('[target="_blank"]', "target", "_self")
10351040

1041+
def is_checked(self, selector):
1042+
"""Return True if checkbox (or radio button) is checked."""
1043+
self.find_element(selector, timeout=settings.SMALL_TIMEOUT)
1044+
return self.get_element_attribute(selector, "checked")
1045+
1046+
def is_selected(self, selector):
1047+
return self.is_checked(selector)
1048+
1049+
def check_if_unchecked(self, selector):
1050+
if not self.is_checked(selector):
1051+
self.click(selector)
1052+
1053+
def select_if_unselected(self, selector):
1054+
self.check_if_unchecked(selector)
1055+
1056+
def uncheck_if_checked(self, selector):
1057+
if self.is_checked(selector):
1058+
self.click(selector)
1059+
1060+
def unselect_if_selected(self, selector):
1061+
self.uncheck_if_checked(selector)
1062+
10361063
def is_element_present(self, selector):
10371064
try:
10381065
self.select(selector, timeout=0.01)

seleniumbase/fixtures/base_case.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1884,6 +1884,8 @@ def get_attribute(
18841884
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
18851885
timeout = self.__get_new_timeout(timeout)
18861886
selector, by = self.__recalculate_selector(selector, by)
1887+
if self.__is_cdp_swap_needed():
1888+
return self.cdp.get_element_attribute(selector)
18871889
self.wait_for_ready_state_complete()
18881890
time.sleep(0.01)
18891891
if self.__is_shadow_selector(selector):
@@ -2460,16 +2462,14 @@ def is_checked(self, selector, by="css selector", timeout=None):
24602462
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
24612463
timeout = self.__get_new_timeout(timeout)
24622464
selector, by = self.__recalculate_selector(selector, by)
2465+
if self.__is_cdp_swap_needed():
2466+
return self.cdp.is_checked(selector)
24632467
kind = self.get_attribute(selector, "type", by=by, timeout=timeout)
24642468
if kind != "checkbox" and kind != "radio":
24652469
raise Exception("Expecting a checkbox or a radio button element!")
2466-
is_checked = self.get_attribute(
2470+
return self.get_attribute(
24672471
selector, "checked", by=by, timeout=timeout, hard_fail=False
24682472
)
2469-
if is_checked:
2470-
return True
2471-
else: # (NoneType)
2472-
return False
24732473

24742474
def is_selected(self, selector, by="css selector", timeout=None):
24752475
"""Same as is_checked()"""
@@ -2479,6 +2479,9 @@ def check_if_unchecked(self, selector, by="css selector"):
24792479
"""If a checkbox or radio button is not checked, will check it."""
24802480
self.__check_scope()
24812481
selector, by = self.__recalculate_selector(selector, by)
2482+
if self.__is_cdp_swap_needed():
2483+
self.cdp.check_if_unchecked(selector)
2484+
return
24822485
if not self.is_checked(selector, by=by):
24832486
if self.is_element_visible(selector, by=by):
24842487
self.click(selector, by=by)
@@ -2515,6 +2518,9 @@ def uncheck_if_checked(self, selector, by="css selector"):
25152518
"""If a checkbox is checked, will uncheck it."""
25162519
self.__check_scope()
25172520
selector, by = self.__recalculate_selector(selector, by)
2521+
if self.__is_cdp_swap_needed():
2522+
self.cdp.uncheck_if_checked(selector)
2523+
return
25182524
if self.is_checked(selector, by=by):
25192525
if self.is_element_visible(selector, by=by):
25202526
self.click(selector, by=by)
@@ -6087,6 +6093,9 @@ def scroll_to(self, selector, by="css selector", timeout=None):
60876093
timeout = settings.SMALL_TIMEOUT
60886094
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
60896095
timeout = self.__get_new_timeout(timeout)
6096+
if self.__is_cdp_swap_needed():
6097+
self.cdp.scroll_into_view(selector)
6098+
return
60906099
if self.demo_mode or self.slow_mode:
60916100
self.slow_scroll_to(selector, by=by, timeout=timeout)
60926101
return

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@
171171
'pygments>=2.18.0',
172172
'pyreadline3>=3.5.3;platform_system=="Windows"',
173173
"tabcompleter>=1.4.0",
174-
"pdbp>=1.6.0",
174+
"pdbp>=1.6.1",
175175
"idna==3.10",
176176
'chardet==5.2.0',
177177
'charset-normalizer==3.4.0',

0 commit comments

Comments
 (0)