Skip to content

Commit fa792e0

Browse files
committed
Update CDP Mode
1 parent 31cc245 commit fa792e0

File tree

7 files changed

+61
-65
lines changed

7 files changed

+61
-65
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)

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/core/browser_launcher.py

Lines changed: 2 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

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(

seleniumbase/undetected/cdp_driver/element.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -501,8 +501,8 @@ async def mouse_click_async(
501501
logger.warning("Could not calculate box model for %s", self)
502502
return
503503
logger.debug("Clicking on location: %.2f, %.2f" % center)
504-
await asyncio.gather(
505-
self.flash_async(0.25),
504+
asyncio.create_task(self.flash_async(0.25))
505+
asyncio.create_task(
506506
self._tab.send(
507507
cdp.input_.dispatch_mouse_event(
508508
"mousePressed",
@@ -514,6 +514,8 @@ async def mouse_click_async(
514514
click_count=1,
515515
)
516516
),
517+
)
518+
asyncio.create_task(
517519
self._tab.send(
518520
cdp.input_.dispatch_mouse_event(
519521
"mouseReleased",
@@ -558,11 +560,13 @@ async def mouse_click_with_offset_async(
558560
logger.debug("Clicking on location: %.2f, %.2f" % center_pos)
559561
else:
560562
logger.debug("Clicking on location: %.2f, %.2f" % (x_pos, y_pos))
561-
await asyncio.gather(
563+
asyncio.create_task(
562564
self.flash_async(
563-
x_offset=x_offset - int(width / 2),
564-
y_offset=y_offset - int(height / 2),
565+
x_offset=x_offset - (width / 2),
566+
y_offset=y_offset - (height / 2),
565567
),
568+
)
569+
asyncio.create_task(
566570
self._tab.send(
567571
cdp.input_.dispatch_mouse_event(
568572
"mousePressed",
@@ -573,7 +577,9 @@ async def mouse_click_with_offset_async(
573577
buttons=buttons,
574578
click_count=1,
575579
)
576-
),
580+
)
581+
)
582+
asyncio.create_task(
577583
self._tab.send(
578584
cdp.input_.dispatch_mouse_event(
579585
"mouseReleased",
@@ -602,16 +608,13 @@ async def mouse_move_async(self):
602608
*center,
603609
self,
604610
)
605-
await self._tab.send(
606-
cdp.input_.dispatch_mouse_event(
607-
"mouseMoved", x=center[0], y=center[1]
608-
)
609-
)
610-
await self._tab.sleep(0.05)
611-
await self._tab.send(
612-
cdp.input_.dispatch_mouse_event(
613-
"mouseReleased", x=center[0], y=center[1]
614-
)
611+
await asyncio.gather(
612+
self._tab.send(
613+
cdp.input_.dispatch_mouse_event(
614+
"mouseMoved", x=center[0], y=center[1]
615+
)
616+
),
617+
self._tab.sleep(0.05),
615618
)
616619

617620
async def mouse_drag_async(

0 commit comments

Comments
 (0)