Skip to content

Commit eed4563

Browse files
authored
Merge pull request #4182 from seleniumbase/cdp-mode-patch-86
CDP Mode: Patch 86
2 parents 31cc245 + c4f0c55 commit eed4563

File tree

12 files changed

+73
-72
lines changed

12 files changed

+73
-72
lines changed

examples/cdp_mode/ReadMe.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,8 @@ sb.cdp.gui_click_and_hold(selector, timeframe=0.35)
506506
sb.cdp.gui_hover_x_y(x, y)
507507
sb.cdp.gui_hover_element(selector)
508508
sb.cdp.gui_hover_and_click(hover_selector, click_selector)
509+
sb.cdp.hover_element(selector)
510+
sb.cdp.hover_and_click(hover_selector, click_selector)
509511
sb.cdp.internalize_links()
510512
sb.cdp.is_checked(selector)
511513
sb.cdp.is_selected(selector)

examples/cdp_mode/raw_canvas.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def get_canvas_pixel_colors_at_top_left(sb):
2929
url = "https://seleniumbase.io/other/canvas"
3030
sb.activate_cdp_mode(url)
3131
sb.assert_title_contains("Canvas")
32-
sb.cdp.gui_click_with_offset("canvas", 0, 0, center=True)
32+
sb.cdp.click_with_offset("canvas", 0, 0, center=True)
3333
sb.sleep(1)
3434
sb.uc_gui_press_key("ENTER")
3535
sb.sleep(0.5)

examples/cdp_mode/raw_demo_site.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
# Hover & click a dropdown element and assert results
2222
sb.cdp.assert_text("Automation Practice", "h3")
23-
sb.cdp.gui_hover_and_click("#myDropdown", "#dropOption2")
23+
sb.cdp.hover_and_click("#myDropdown", "#dropOption2")
2424
sb.cdp.assert_text("Link Two Selected", "h3")
2525

2626
# Click a button and then verify the expected results

examples/cdp_mode/raw_handle_alerts.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
with SB(uc=True, test=True) as sb:
55
url = "https://the-internet.herokuapp.com/javascript_alerts"
66
sb.activate_cdp_mode(url)
7-
sb.cdp.gui_click_element('button[onclick="jsAlert()"]')
7+
sb.click('button[onclick="jsAlert()"]')
88
sb.sleep(1)
99
sb.uc_gui_press_key("\n") # Accept Alert
1010
sb.sleep(1)
11-
sb.cdp.gui_click_element('button[onclick="jsConfirm()"]')
11+
sb.click('button[onclick="jsConfirm()"]')
1212
sb.sleep(1)
1313
sb.uc_gui_press_key("ESC") # Dismiss Alert
1414
sb.sleep(1)
15-
sb.cdp.gui_click_element('button[onclick="jsPrompt()"]')
15+
sb.click('button[onclick="jsPrompt()"]')
1616
sb.sleep(1)
1717
sb.uc_gui_write("Here is my prompt answer\n")
1818
sb.sleep(1)

help_docs/cdp_mode_methods.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ sb.cdp.gui_click_and_hold(selector, timeframe=0.35)
144144
sb.cdp.gui_hover_x_y(x, y)
145145
sb.cdp.gui_hover_element(selector)
146146
sb.cdp.gui_hover_and_click(hover_selector, click_selector)
147+
sb.cdp.hover_element(selector)
148+
sb.cdp.hover_and_click(hover_selector, click_selector)
147149
sb.cdp.internalize_links()
148150
sb.cdp.is_checked(selector)
149151
sb.cdp.is_selected(selector)

help_docs/method_summary.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ self.is_element_in_an_iframe(selector, by="css selector")
111111
self.switch_to_frame_of_element(selector, by="css selector")
112112
self.hover(selector, by="css selector", timeout=None)
113113
# Duplicates:
114+
# self.hover_element(selector, by="css selector", timeout=None)
114115
# self.hover_on_element(selector, by="css selector", timeout=None)
115116
# self.hover_over_element(selector, by="css selector", timeout=None)
116117
self.hover_and_click(

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.45.5"
2+
__version__ = "4.45.6"

seleniumbase/core/browser_launcher.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,8 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
846846
cdp.gui_hover_x_y = CDPM.gui_hover_x_y
847847
cdp.gui_hover_element = CDPM.gui_hover_element
848848
cdp.gui_hover_and_click = CDPM.gui_hover_and_click
849+
cdp.hover_element = CDPM.hover_element
850+
cdp.hover_and_click = CDPM.hover_and_click
849851
cdp.internalize_links = CDPM.internalize_links
850852
cdp.open_new_window = CDPM.open_new_window
851853
cdp.switch_to_window = CDPM.switch_to_window
@@ -2736,6 +2738,7 @@ def _set_chrome_options(
27362738
chrome_options.add_argument("--disable-save-password-bubble")
27372739
chrome_options.add_argument("--disable-single-click-autofill")
27382740
chrome_options.add_argument("--allow-file-access-from-files")
2741+
chrome_options.add_argument("--disable-component-update")
27392742
chrome_options.add_argument("--disable-prompt-on-repost")
27402743
chrome_options.add_argument("--dns-prefetch-disable")
27412744
chrome_options.add_argument("--disable-translate")
@@ -2764,6 +2767,7 @@ def _set_chrome_options(
27642767
included_disabled_features.append("OptimizationHints")
27652768
included_disabled_features.append("OptimizationHintsFetching")
27662769
included_disabled_features.append("Translate")
2770+
included_disabled_features.append("ComponentUpdater")
27672771
included_disabled_features.append("OptimizationTargetPrediction")
27682772
included_disabled_features.append("OptimizationGuideModelDownloading")
27692773
included_disabled_features.append("DownloadBubble")
@@ -4789,6 +4793,7 @@ def get_local_driver(
47894793
if devtools and not headless:
47904794
edge_options.add_argument("--auto-open-devtools-for-tabs")
47914795
edge_options.add_argument("--allow-file-access-from-files")
4796+
edge_options.add_argument("--disable-component-update")
47924797
edge_options.add_argument("--allow-insecure-localhost")
47934798
edge_options.add_argument("--allow-running-insecure-content")
47944799
if user_agent:
@@ -4847,6 +4852,7 @@ def get_local_driver(
48474852
included_disabled_features.append("OptimizationHints")
48484853
included_disabled_features.append("OptimizationHintsFetching")
48494854
included_disabled_features.append("Translate")
4855+
included_disabled_features.append("ComponentUpdater")
48504856
included_disabled_features.append("OptimizationTargetPrediction")
48514857
included_disabled_features.append("OptimizationGuideModelDownloading")
48524858
included_disabled_features.append("InsecureDownloadWarnings")

seleniumbase/core/sb_cdp.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2384,6 +2384,31 @@ def gui_hover_element(self, selector, timeframe=0.25):
23842384
self.__slow_mode_pause_if_set()
23852385
self.loop.run_until_complete(self.page.wait())
23862386

2387+
def hover_element(self, selector, timeframe=0.25):
2388+
element = self.select(selector)
2389+
gui_lock = FileLock(constants.MultiBrowser.PYAUTOGUILOCK)
2390+
with gui_lock:
2391+
self.bring_active_window_to_front()
2392+
self.sleep(0.02)
2393+
element.mouse_move()
2394+
self.sleep(timeframe)
2395+
2396+
def hover_and_click(self, hover_selector, click_selector):
2397+
if getattr(sb_config, "_cdp_mobile_mode", None):
2398+
self.select(click_selector).click()
2399+
return
2400+
hover_element = self.select(hover_selector)
2401+
gui_lock = FileLock(constants.MultiBrowser.PYAUTOGUILOCK)
2402+
with gui_lock:
2403+
self.bring_active_window_to_front()
2404+
self.sleep(0.02)
2405+
hover_element.mouse_move()
2406+
self.sleep(0.25)
2407+
try:
2408+
self.click(click_selector, timeout=0.5)
2409+
except Exception:
2410+
self.select(click_selector, timeout=2).click()
2411+
23872412
def gui_hover_and_click(self, hover_selector, click_selector):
23882413
if getattr(sb_config, "_cdp_mobile_mode", None):
23892414
self.select(click_selector).click()

seleniumbase/fixtures/base_case.py

Lines changed: 10 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,14 +1637,14 @@ def get_partial_link_text_attribute(
16371637
def click_link_text(self, link_text, timeout=None):
16381638
"""This method clicks link text on a page."""
16391639
self.__check_scope()
1640-
if self.__is_cdp_swap_needed():
1641-
self.cdp.find_element(link_text, timeout=timeout).click()
1642-
return
1643-
self.__skip_if_esc()
16441640
if not timeout:
16451641
timeout = settings.SMALL_TIMEOUT
16461642
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
16471643
timeout = self.__get_new_timeout(timeout)
1644+
if self.__is_cdp_swap_needed():
1645+
self.cdp.find_element(link_text, timeout=timeout).click()
1646+
return
1647+
self.__skip_if_esc()
16481648
link_text = self.__get_type_checked_text(link_text)
16491649
if self.__is_cdp_swap_needed():
16501650
self.cdp.click_link(link_text)
@@ -2717,7 +2717,7 @@ def hover(self, selector, by="css selector", timeout=None):
27172717
original_by = by
27182718
selector, by = self.__recalculate_selector(selector, by)
27192719
if self.__is_cdp_swap_needed():
2720-
self.cdp.gui_hover_element(selector)
2720+
self.cdp.hover_element(selector)
27212721
return
27222722
self.wait_for_element_visible(
27232723
original_selector, by=original_by, timeout=timeout
@@ -2762,7 +2762,7 @@ def hover_and_click(
27622762
click_selector, click_by
27632763
)
27642764
if self.__is_cdp_swap_needed():
2765-
self.cdp.gui_hover_and_click(hover_selector, click_selector)
2765+
self.cdp.hover_and_click(hover_selector, click_selector)
27662766
return
27672767
dropdown_element = self.wait_for_element_visible(
27682768
original_selector, by=original_by, timeout=timeout
@@ -9291,81 +9291,42 @@ def input(
92919291
self, selector, text, by="css selector", timeout=None, retry=False
92929292
):
92939293
"""Same as self.update_text()"""
9294-
self.__check_scope()
9295-
if not timeout:
9296-
timeout = settings.LARGE_TIMEOUT
9297-
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
9298-
timeout = self.__get_new_timeout(timeout)
9299-
selector, by = self.__recalculate_selector(selector, by)
93009294
self.update_text(selector, text, by=by, timeout=timeout, retry=retry)
93019295

93029296
def fill(
93039297
self, selector, text, by="css selector", timeout=None, retry=False
93049298
):
93059299
"""Same as self.update_text()"""
9306-
self.__check_scope()
9307-
if not timeout:
9308-
timeout = settings.LARGE_TIMEOUT
9309-
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
9310-
timeout = self.__get_new_timeout(timeout)
9311-
selector, by = self.__recalculate_selector(selector, by)
93129300
self.update_text(selector, text, by=by, timeout=timeout, retry=retry)
93139301

93149302
def write(
93159303
self, selector, text, by="css selector", timeout=None, retry=False
93169304
):
93179305
"""Same as self.update_text()"""
9318-
self.__check_scope()
9319-
if not timeout:
9320-
timeout = settings.LARGE_TIMEOUT
9321-
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
9322-
timeout = self.__get_new_timeout(timeout)
9323-
selector, by = self.__recalculate_selector(selector, by)
93249306
self.update_text(selector, text, by=by, timeout=timeout, retry=retry)
93259307

93269308
def click_link(self, link_text, timeout=None):
93279309
"""Same as self.click_link_text()"""
9328-
self.__check_scope()
9329-
if not timeout:
9330-
timeout = settings.SMALL_TIMEOUT
9331-
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
9332-
timeout = self.__get_new_timeout(timeout)
93339310
self.click_link_text(link_text, timeout=timeout)
93349311

93359312
def click_partial_link(self, partial_link_text, timeout=None):
93369313
"""Same as self.click_partial_link_text()"""
9337-
self.__check_scope()
9338-
if not timeout:
9339-
timeout = settings.SMALL_TIMEOUT
9340-
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
9341-
timeout = self.__get_new_timeout(timeout)
93429314
self.click_partial_link_text(partial_link_text, timeout=timeout)
93439315

93449316
def right_click(self, selector, by="css selector", timeout=None):
93459317
"""Same as self.context_click()"""
9346-
self.__check_scope()
9347-
if not timeout:
9348-
timeout = settings.SMALL_TIMEOUT
9349-
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
9350-
timeout = self.__get_new_timeout(timeout)
93519318
self.context_click(selector, by=by, timeout=timeout)
93529319

9320+
def hover_element(self, selector, by="css selector", timeout=None):
9321+
"""Same as self.hover()"""
9322+
return self.hover(selector, by=by, timeout=timeout)
9323+
93539324
def hover_on_element(self, selector, by="css selector", timeout=None):
93549325
"""Same as self.hover()"""
9355-
self.__check_scope()
9356-
if not timeout:
9357-
timeout = settings.SMALL_TIMEOUT
9358-
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
9359-
timeout = self.__get_new_timeout(timeout)
93609326
return self.hover(selector, by=by, timeout=timeout)
93619327

93629328
def hover_over_element(self, selector, by="css selector", timeout=None):
93639329
"""Same as self.hover()"""
9364-
self.__check_scope()
9365-
if not timeout:
9366-
timeout = settings.SMALL_TIMEOUT
9367-
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
9368-
timeout = self.__get_new_timeout(timeout)
93699330
return self.hover(selector, by=by, timeout=timeout)
93709331

93719332
def wait_for_element_visible(

0 commit comments

Comments
 (0)