diff --git a/examples/cdp_mode/ReadMe.md b/examples/cdp_mode/ReadMe.md index dc059a18..d414567b 100644 --- a/examples/cdp_mode/ReadMe.md +++ b/examples/cdp_mode/ReadMe.md @@ -368,6 +368,9 @@ sb.cdp.get_element_attribute(selector, attribute) sb.cdp.get_element_html(selector) sb.cdp.set_locale(locale) sb.cdp.set_attributes(selector, attribute, value) +sb.cdp.gui_press_key(key) +sb.cdp.gui_press_keys(keys) +sb.cdp.gui_write(text) sb.cdp.gui_click_x_y(x, y) sb.cdp.gui_click_element(selector) sb.cdp.internalize_links() diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index 1f4897c7..37d67d0f 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -620,6 +620,9 @@ def uc_open_with_cdp_mode(driver, url=None): cdp.reset_window_size = CDPM.reset_window_size cdp.set_locale = CDPM.set_locale cdp.set_attributes = CDPM.set_attributes + cdp.gui_press_key = CDPM.gui_press_key + cdp.gui_press_keys = CDPM.gui_press_keys + cdp.gui_write = CDPM.gui_write cdp.gui_click_x_y = CDPM.gui_click_x_y cdp.gui_click_element = CDPM.gui_click_element cdp.internalize_links = CDPM.internalize_links @@ -721,6 +724,9 @@ def uc_click( timeout=settings.SMALL_TIMEOUT, reconnect_time=None, ): + if __is_cdp_swap_needed(driver): + driver.cdp.click(selector) + return with suppress(Exception): rct = float(by) # Add shortcut: driver.uc_click(selector, RCT) if not reconnect_time: diff --git a/seleniumbase/core/sb_cdp.py b/seleniumbase/core/sb_cdp.py index b8afadd1..ed432cfe 100644 --- a/seleniumbase/core/sb_cdp.py +++ b/seleniumbase/core/sb_cdp.py @@ -942,6 +942,45 @@ class CDPMethods(): ) return pyautogui_copy + def gui_press_key(self, key): + self.__install_pyautogui_if_missing() + import pyautogui + pyautogui = self.__get_configured_pyautogui(pyautogui) + gui_lock = fasteners.InterProcessLock( + constants.MultiBrowser.PYAUTOGUILOCK + ) + with gui_lock: + pyautogui.press(key) + time.sleep(0.0375) + self.__slow_mode_pause_if_set() + self.loop.run_until_complete(self.page.wait()) + + def gui_press_keys(self, keys): + self.__install_pyautogui_if_missing() + import pyautogui + pyautogui = self.__get_configured_pyautogui(pyautogui) + gui_lock = fasteners.InterProcessLock( + constants.MultiBrowser.PYAUTOGUILOCK + ) + with gui_lock: + for key in keys: + pyautogui.press(key) + time.sleep(0.0375) + self.__slow_mode_pause_if_set() + self.loop.run_until_complete(self.page.wait()) + + def gui_write(self, text): + self.__install_pyautogui_if_missing() + import pyautogui + pyautogui = self.__get_configured_pyautogui(pyautogui) + gui_lock = fasteners.InterProcessLock( + constants.MultiBrowser.PYAUTOGUILOCK + ) + with gui_lock: + pyautogui.write(text) + self.__slow_mode_pause_if_set() + self.loop.run_until_complete(self.page.wait()) + def __gui_click_x_y(self, x, y, timeframe=0.25, uc_lock=False): self.__install_pyautogui_if_missing() import pyautogui diff --git a/seleniumbase/plugins/driver_manager.py b/seleniumbase/plugins/driver_manager.py index b47bc1ac..2b7928c6 100644 --- a/seleniumbase/plugins/driver_manager.py +++ b/seleniumbase/plugins/driver_manager.py @@ -550,11 +550,7 @@ def Driver( or uc_sub ): undetectable = True - if ( - (undetectable or undetected or uc) - and (uc_subprocess is None) - and (uc_sub is None) - ): + if undetectable or undetected or uc: uc_subprocess = True # Use UC as a subprocess by default. elif ( "--undetectable" in sys_argv diff --git a/seleniumbase/plugins/sb_manager.py b/seleniumbase/plugins/sb_manager.py index a7ba66bf..8a8839e9 100644 --- a/seleniumbase/plugins/sb_manager.py +++ b/seleniumbase/plugins/sb_manager.py @@ -608,11 +608,7 @@ def SB( or uc_sub ): undetectable = True - if ( - (undetectable or undetected or uc) - and (uc_subprocess is None) - and (uc_sub is None) - ): + if undetectable or undetected or uc: uc_subprocess = True # Use UC as a subprocess by default. elif ( "--undetectable" in sys_argv diff --git a/seleniumbase/undetected/cdp_driver/connection.py b/seleniumbase/undetected/cdp_driver/connection.py index 7eba23cb..da9df3da 100644 --- a/seleniumbase/undetected/cdp_driver/connection.py +++ b/seleniumbase/undetected/cdp_driver/connection.py @@ -18,6 +18,7 @@ from typing import ( TypeVar, ) import websockets +from websockets.protocol import State from . import cdp_util as util import mycdp as cdp import mycdp.network @@ -261,7 +262,7 @@ class Connection(metaclass=CantTouchThis): """ Opens the websocket connection. Shouldn't be called manually by users. """ - if not self.websocket or self.websocket.closed: + if not self.websocket or self.websocket.state is State.CLOSED: try: self.websocket = await websockets.connect( self.websocket_url, @@ -288,7 +289,7 @@ class Connection(metaclass=CantTouchThis): """ Closes the websocket connection. Shouldn't be called manually by users. """ - if self.websocket and not self.websocket.closed: + if self.websocket and self.websocket.state is not State.CLOSED: if self.listener and self.listener.running: self.listener.cancel() self.enabled_domains.clear() @@ -393,7 +394,7 @@ class Connection(metaclass=CantTouchThis): when multiple calls to connection.send() are made. """ await self.aopen() - if not self.websocket or self.closed: + if not self.websocket or self.websocket.state is State.CLOSED: return if self._owner: browser = self._owner