Skip to content

Commit cd73133

Browse files
committed
Update CDP Mode
1 parent 7fadabd commit cd73133

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

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

0 commit comments

Comments
 (0)