From 814c21ed7d0e94d459778b32db8be1fe7eb85ba5 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 19 Aug 2026 00:15:49 -0400 Subject: [PATCH 1/7] Update CDP Mode --- seleniumbase/core/sb_cdp.py | 55 ++++------- seleniumbase/undetected/cdp_driver/browser.py | 37 ++++--- .../undetected/cdp_driver/cdp_util.py | 66 ++++++------- seleniumbase/undetected/cdp_driver/config.py | 24 ++--- .../undetected/cdp_driver/connection.py | 35 +++---- seleniumbase/undetected/cdp_driver/element.py | 96 ++++++++++++------- seleniumbase/undetected/cdp_driver/tab.py | 70 +++++++------- 7 files changed, 191 insertions(+), 192 deletions(-) diff --git a/seleniumbase/core/sb_cdp.py b/seleniumbase/core/sb_cdp.py index 713809a0cc8..d71aa2b1786 100644 --- a/seleniumbase/core/sb_cdp.py +++ b/seleniumbase/core/sb_cdp.py @@ -116,7 +116,9 @@ def __add_sync_methods(self, element): element.send_file = ( lambda *file_paths: self.__send_file(element, *file_paths) ) - element.send_keys = lambda text: self.__send_keys(element, text) + element.send_keys = lambda text, **kwargs: self.__send_keys( + element, text, **kwargs + ) element.set_text = lambda value: self.__set_text(element, value) element.set_value = lambda value: self.__set_value(element, value) element.type = lambda text: self.__type(element, text) @@ -721,9 +723,11 @@ def __send_file(self, element, *file_paths): self.loop.run_until_complete(element.send_file_async(*file_paths)) ) - def __send_keys(self, element, text): + def __send_keys(self, element, text, **kwargs): return ( - self.loop.run_until_complete(element.send_keys_async(text)) + self.loop.run_until_complete( + element.send_keys_async(text, **kwargs) + ) ) def __set_text(self, element, value): @@ -1270,26 +1274,7 @@ def press_keys(self, selector, text, timeout=None): self.__slow_mode_pause_if_set() element = self.select(selector, timeout=timeout) element.scroll_into_view() - submit = False - if text.endswith("\n") or text.endswith("\r"): - submit = True - text = text[:-1] - elif ( - element.tag_name == "textarea" - and "\n" in text - and "\r" not in text - ): - text = text.replace("\n", "\r") - for key in text: - try: - element.send_keys(key) - except AttributeError: - element = self.select(selector, timeout=0.1) - element.send_keys(key) - time.sleep(float(0.0422 + (random.random() / 112.0))) - if submit: - element.send_keys("\r\n") - time.sleep(0.044) + element.send_keys(text, add_delay=True) self.__slow_mode_pause_if_set() self.loop.run_until_complete(self.page.sleep(0.025)) @@ -1367,18 +1352,18 @@ def set_value(self, selector, text, timeout=None): self.loop.run_until_complete(self.page.sleep(0.025)) def submit(self, selector): - submit_script = ( - """elm = document.querySelector('%s'); - const event = new KeyboardEvent("keydown", { - key: "Enter", - keyCode: 13, - code: "Enter", - which: 13, - bubbles: true - }); - elm.dispatchEvent(event);""" % selector - ) - self.loop.run_until_complete(self.page.evaluate(submit_script)) + element = self.find_element(selector, timeout=1) + try: + element.press_keys("\n") + except Exception: + submit_script = ( + """ + const el = document.querySelector('%s'); + const form = el.form ?? el.closest('form'); + form.requestSubmit(); + """ % selector + ) + self.loop.run_until_complete(self.page.evaluate(submit_script)) def evaluate(self, expression): """Run a JavaScript expression and return the result.""" diff --git a/seleniumbase/undetected/cdp_driver/browser.py b/seleniumbase/undetected/cdp_driver/browser.py index 2c72cb65856..384b2a626d4 100644 --- a/seleniumbase/undetected/cdp_driver/browser.py +++ b/seleniumbase/undetected/cdp_driver/browser.py @@ -22,7 +22,6 @@ from seleniumbase import config as sb_config from seleniumbase.fixtures import constants from seleniumbase.fixtures import shared_utils -from typing import List, Optional, Set, Tuple, Union import mycdp as cdp from . import cdp_util as util from . import tab @@ -116,7 +115,7 @@ async def create( incognito: bool = False, guest: bool = False, browser_executable_path: PathLike = None, - browser_args: List[str] = None, + browser_args: list[str] = None, sandbox: bool = True, host: str = None, port: int = None, @@ -160,7 +159,7 @@ def __init__(self, config: Config, **kwargs): ) ) self.config = config - self.targets: List = [] + self.targets: list = [] self.info = None self._target = None self._process = None @@ -182,7 +181,7 @@ def main_tab(self) -> tab.Tab: )[0] @property - def tabs(self) -> List[tab.Tab]: + def tabs(self) -> list[tab.Tab]: """Returns the current targets which are of type "page".""" tabs = filter(lambda item: item.type_ == "page", self.targets) return list(tabs) @@ -199,7 +198,7 @@ def stopped(self): return False return True - async def wait(self, time: Union[float, int] = 1) -> Browser: + async def wait(self, time: float | int = 1) -> Browser: """Wait for