diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 5e17db8a265..47e541ebfb1 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.37.11" +__version__ = "4.37.12" diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index a23496ba84c..34c0ded00a1 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -519,16 +519,6 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs): import asyncio from seleniumbase.undetected.cdp_driver import cdp_util - if ( - hasattr(driver, "_is_using_cdp") - and driver._is_using_cdp - and hasattr(driver, "cdp") - and driver.cdp - ): - # CDP Mode was already initialized - driver.disconnect() - driver.cdp.open(url, **kwargs) - return current_url = None try: current_url = driver.current_url @@ -553,6 +543,23 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs): if url_protocol not in ["about", "data", "chrome"]: safe_url = False + if ( + hasattr(driver, "_is_using_cdp") + and driver._is_using_cdp + and hasattr(driver, "cdp") + and driver.cdp + and hasattr(driver.cdp, "loop") + ): + # CDP Mode was already initialized + driver.cdp.open(url, **kwargs) + if not safe_url: + time.sleep(constants.UC.CDP_MODE_OPEN_WAIT) + if IS_WINDOWS: + time.sleep(constants.UC.EXTRA_WINDOWS_WAIT) + else: + time.sleep(0.012) + return + headless = False headed = None xvfb = None diff --git a/seleniumbase/plugins/sb_manager.py b/seleniumbase/plugins/sb_manager.py index b56a8c585f9..45cd307e4cd 100644 --- a/seleniumbase/plugins/sb_manager.py +++ b/seleniumbase/plugins/sb_manager.py @@ -1369,23 +1369,18 @@ def SB( "%s%s%s%s%s" % (c1, left_space, end_text, right_space, cr) ) - python3_12_or_newer = (sys.version_info >= (3, 12)) - if undetectable: + if undetectable and hasattr(sb, "_drivers_browser_map"): import asyncio - if not python3_12_or_newer and hasattr(sb_config, "_cdp_aclose"): - with suppress(Exception): - loop = asyncio.get_event_loop() - asyncio.set_event_loop(loop) - loop.run_until_complete(sb_config._cdp_aclose()) - if python3_12_or_newer and hasattr(sb, "_drivers_browser_map"): - for driver in sb._drivers_browser_map.keys(): - if hasattr(driver, "cdp") and driver.cdp: - asyncio.set_event_loop(driver.cdp.loop) - tasks = [tab.aclose() for tab in driver.cdp.get_tabs()] - tasks.append(driver.cdp.driver.connection.aclose()) - driver.cdp.loop.run_until_complete( - asyncio.gather(*tasks) - ) + for driver in sb._drivers_browser_map.keys(): + if ( + hasattr(driver, "cdp") + and driver.cdp + and hasattr(driver.cdp, "loop") + ): + asyncio.set_event_loop(driver.cdp.loop) + tasks = [tab.aclose() for tab in driver.cdp.get_tabs()] + tasks.append(driver.cdp.driver.connection.aclose()) + driver.cdp.loop.run_until_complete(asyncio.gather(*tasks)) driver.cdp.loop.close() gc.collect() if test and test_name and not test_passed and raise_test_failure: diff --git a/seleniumbase/undetected/cdp_driver/connection.py b/seleniumbase/undetected/cdp_driver/connection.py index 5b146526691..8bcdc82ff36 100644 --- a/seleniumbase/undetected/cdp_driver/connection.py +++ b/seleniumbase/undetected/cdp_driver/connection.py @@ -19,7 +19,6 @@ ) import websockets from websockets.protocol import State -from seleniumbase import config as sb_config from . import cdp_util as util import mycdp as cdp import mycdp.network @@ -271,11 +270,10 @@ async def aopen(self, **kw): max_size=MAX_SIZE, ) self.listener = Listener(self) - sb_config._cdp_aclose = self.aclose except (Exception,) as e: logger.debug("Exception during opening of websocket: %s", e) if self.listener: - self.listener.cancel() + await self.listener.cancel() raise if not self.listener or not self.listener.running: self.listener = Listener(self) @@ -300,7 +298,7 @@ async def aclose(self): self.websocket_url ) if self.listener and self.listener.running: - self.listener.cancel() + await self.listener.cancel() self.enabled_domains.clear() logger.debug( "\n❌ Closed websocket connection to %s", self.websocket_url @@ -446,7 +444,6 @@ async def send( if not _is_update: await self._register_handlers() await self.websocket.send(tx.message) - sb_config._cdp_aclose = self.aclose try: return await tx except ProtocolException as e: @@ -557,9 +554,13 @@ def time_before_considered_idle(self): def time_before_considered_idle(self, seconds: Union[int, float]): self._time_before_considered_idle = seconds - def cancel(self): + async def cancel(self): if self.task and not self.task.cancelled(): self.task.cancel() + try: + await self.task + except asyncio.CancelledError: + pass @property def running(self):