From f70cf864ea1fc5811bb268ed27b07b6a53691641 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 5 Mar 2025 13:11:40 -0500 Subject: [PATCH 1/4] Update CDP Mode --- seleniumbase/core/browser_launcher.py | 2 ++ seleniumbase/core/sb_cdp.py | 12 +++++++++++- seleniumbase/fixtures/base_case.py | 5 ++++- seleniumbase/undetected/__init__.py | 1 + seleniumbase/undetected/cdp_driver/browser.py | 2 +- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index 30ef2bf1..182c70c5 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -682,8 +682,10 @@ def uc_open_with_cdp_mode(driver, url=None): cdp.gui_hover_element = CDPM.gui_hover_element cdp.gui_hover_and_click = CDPM.gui_hover_and_click cdp.internalize_links = CDPM.internalize_links + cdp.open_new_window = CDPM.open_new_window cdp.switch_to_window = CDPM.switch_to_window cdp.switch_to_newest_window = CDPM.switch_to_newest_window + cdp.open_new_tab = CDPM.open_new_tab cdp.switch_to_tab = CDPM.switch_to_tab cdp.switch_to_newest_tab = CDPM.switch_to_newest_tab cdp.close_active_tab = CDPM.close_active_tab diff --git a/seleniumbase/core/sb_cdp.py b/seleniumbase/core/sb_cdp.py index a4f5fba4..31bb25b1 100644 --- a/seleniumbase/core/sb_cdp.py +++ b/seleniumbase/core/sb_cdp.py @@ -106,7 +106,7 @@ class CDPMethods(): driver = self.driver if hasattr(driver, "cdp_base"): driver = driver.cdp_base - self.page = self.loop.run_until_complete(driver.get(url)) + self.loop.run_until_complete(self.page.get(url)) url_protocol = url.split(":")[0] safe_url = True if url_protocol not in ["about", "data", "chrome"]: @@ -1014,12 +1014,22 @@ class CDPMethods(): self.set_window_rect(x, y, width, height) self.__add_light_pause() + def open_new_window(self, url=None, switch_to=True): + return self.open_new_tab(url=url, switch_to=switch_to) + def switch_to_window(self, window): self.switch_to_tab(window) def switch_to_newest_window(self): self.switch_to_tab(-1) + def open_new_tab(self, url=None, switch_to=True): + if not isinstance(url, str): + url = "about:blank" + self.loop.run_until_complete(self.page.get(url, new_tab=True)) + if switch_to: + self.switch_to_newest_tab() + def switch_to_tab(self, tab): driver = self.driver if hasattr(driver, "cdp_base"): diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index 036dd305..905d93ea 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -3896,6 +3896,9 @@ class BaseCase(unittest.TestCase): def open_new_window(self, switch_to=True): """Opens a new browser tab/window and switches to it by default.""" + if self.__is_cdp_swap_needed(): + self.cdp.open_new_tab(switch_to=switch_to) + return self.wait_for_ready_state_complete() if switch_to: try: @@ -10339,7 +10342,7 @@ class BaseCase(unittest.TestCase): timeout = self.__get_new_timeout(timeout) selector, by = self.__recalculate_selector(selector, by) if self.__is_cdp_swap_needed(): - return self.cdp.wait_for_text( + return self.cdp.wait_for_text_not_visible( text, selector=selector, timeout=timeout ) return page_actions.wait_for_text_not_visible( diff --git a/seleniumbase/undetected/__init__.py b/seleniumbase/undetected/__init__.py index 4a6827ea..5635d635 100644 --- a/seleniumbase/undetected/__init__.py +++ b/seleniumbase/undetected/__init__.py @@ -477,6 +477,7 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver): with suppress(Exception): if self.service.is_connectable(): self.stop_client() + time.sleep(0.003) self.service.stop() self._is_connected = False diff --git a/seleniumbase/undetected/cdp_driver/browser.py b/seleniumbase/undetected/cdp_driver/browser.py index 2c0051e4..1224fcdc 100644 --- a/seleniumbase/undetected/cdp_driver/browser.py +++ b/seleniumbase/undetected/cdp_driver/browser.py @@ -792,7 +792,7 @@ class CookieJar: connection = self._browser.connection cookies = await connection.send(cdp.network.get_cookies()) if cookies: - await connection.send(cdp.network.clear_cookies()) + await connection.send(cdp.storage.clear_cookies()) class HTTPApi: From cbcac523c8899f7a1d3f2704675f0512492c81c7 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 5 Mar 2025 13:12:22 -0500 Subject: [PATCH 2/4] Update the CDP Mode docs --- examples/cdp_mode/ReadMe.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/cdp_mode/ReadMe.md b/examples/cdp_mode/ReadMe.md index 27f8ac81..ede98774 100644 --- a/examples/cdp_mode/ReadMe.md +++ b/examples/cdp_mode/ReadMe.md @@ -420,8 +420,10 @@ sb.cdp.minimize() sb.cdp.medimize() sb.cdp.set_window_rect() sb.cdp.reset_window_size() +sb.cdp.open_new_window(url=None, switch_to=True) sb.cdp.switch_to_window(window) sb.cdp.switch_to_newest_window() +sb.cdp.open_new_tab(url=None, switch_to=True) sb.cdp.switch_to_tab(tab) sb.cdp.switch_to_newest_tab() sb.cdp.close_active_tab() From d1075608dad98c740e212e55f4b5ae6b4864e06b Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 5 Mar 2025 13:13:37 -0500 Subject: [PATCH 3/4] Add a new CDP Mode example --- examples/cdp_mode/raw_tab_switching.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 examples/cdp_mode/raw_tab_switching.py diff --git a/examples/cdp_mode/raw_tab_switching.py b/examples/cdp_mode/raw_tab_switching.py new file mode 100644 index 00000000..42e1e3bc --- /dev/null +++ b/examples/cdp_mode/raw_tab_switching.py @@ -0,0 +1,15 @@ +from seleniumbase import SB + +with SB(uc=True) as sb: + sb.activate_cdp_mode() + sb.open("data:text/html,

Page A

") + sb.assert_text("Page A") + sb.open_new_tab() + sb.open("data:text/html,

Page B

") + sb.assert_text("Page B") + sb.switch_to_tab(0) + sb.assert_text("Page A") + sb.assert_text_not_visible("Page B") + sb.switch_to_tab(1) + sb.assert_text("Page B") + sb.assert_text_not_visible("Page A") From dce8eb6860f0304fce363ad7ee34781d87ee3bd2 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 5 Mar 2025 13:14:33 -0500 Subject: [PATCH 4/4] Version 4.35.4 --- seleniumbase/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 1ef94d85..7fb5236d 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.35.3" +__version__ = "4.35.4"