From b293b22499181078221e11f3c969cf15ce52733d Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Thu, 15 Jan 2026 19:42:51 -0500 Subject: [PATCH 1/4] Update and refactor CDP Mode --- seleniumbase/core/sb_cdp.py | 39 ++++++++++++++----- seleniumbase/fixtures/base_case.py | 1 + seleniumbase/undetected/cdp_driver/browser.py | 18 +++++---- .../undetected/cdp_driver/connection.py | 17 +++++--- 4 files changed, 52 insertions(+), 23 deletions(-) diff --git a/seleniumbase/core/sb_cdp.py b/seleniumbase/core/sb_cdp.py index 0c93bf4aa89..e9e2fe3ece7 100644 --- a/seleniumbase/core/sb_cdp.py +++ b/seleniumbase/core/sb_cdp.py @@ -795,15 +795,13 @@ def click_if_visible(self, selector, timeout=0): if self.is_element_visible(selector): with suppress(Exception): self.click(selector, timeout=1) + elif timeout == 0: + return else: with suppress(Exception): - element = self.find_element(selector, timeout=timeout) - self.sleep(0.1) - element.scroll_into_view() - self.sleep(0.1) - element.click() - self.__slow_mode_pause_if_set() - self.loop.run_until_complete(self.page.wait()) + self.find_element(selector, timeout=timeout) + if self.is_element_visible(selector): + self.click(selector, timeout=1) def click_visible_elements(self, selector, limit=0): """Finds all matching page elements and clicks visible ones in order. @@ -2068,14 +2066,35 @@ def __cdp_click_incapsula_hcaptcha(self): time.sleep(0.05) x_offset = 30 y_offset = 36 + was_clicked = False gui_lock = FileLock(constants.MultiBrowser.PYAUTOGUILOCK) with gui_lock: # Prevent issues with multiple processes self.bring_active_window_to_front() - time.sleep(0.05) + time.sleep(0.056) + if "--debug" in sys.argv: + displayed_selector = "`%s`" % selector + if '"' not in selector: + displayed_selector = '"%s"' % selector + elif "'" not in selector: + displayed_selector = "'%s'" % selector + print( + " click_with_offset(%s, %s, %s)" + % (displayed_selector, x_offset, y_offset) + ) with suppress(Exception): element.click_with_offset(x_offset, y_offset) - time.sleep(0.2) - return True + was_clicked = True + time.sleep(0.056) + if was_clicked: + # Wait a moment for the click to succeed + time.sleep(0.25) + self.__slow_mode_pause_if_set() + self.loop.run_until_complete(self.page.wait()) + if "--debug" in sys.argv: + print(" hCaptcha was clicked!") + return True + if "--debug" in sys.argv: + print(" hCaptcha was NOT clicked!") return False def solve_captcha(self): diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index 5a17810165f..e60b3ae665e 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -92,6 +92,7 @@ def test_anything(self): logging.getLogger("requests").setLevel(logging.ERROR) logging.getLogger("urllib3").setLevel(logging.ERROR) +logging.getLogger("websocket").setLevel(logging.CRITICAL) urllib3.disable_warnings() LOGGER.setLevel(logging.WARNING) is_linux = shared_utils.is_linux() diff --git a/seleniumbase/undetected/cdp_driver/browser.py b/seleniumbase/undetected/cdp_driver/browser.py index b39a62d848d..98d77107f1d 100644 --- a/seleniumbase/undetected/cdp_driver/browser.py +++ b/seleniumbase/undetected/cdp_driver/browser.py @@ -182,7 +182,6 @@ def stopped(self): if self._process and self._process.returncode is None: return False return True - # return (self._process and self._process.returncode) or False async def wait(self, time: Union[float, int] = 1) -> Browser: """Wait for