diff --git a/examples/cdp_mode/ReadMe.md b/examples/cdp_mode/ReadMe.md index 56dae0d5562..1c70e039ae6 100644 --- a/examples/cdp_mode/ReadMe.md +++ b/examples/cdp_mode/ReadMe.md @@ -361,8 +361,8 @@ with SB(uc=True, test=True, locale="en", pls="none") as sb: ### 🐙 CDP Mode API / Methods ```python -sb.cdp.get(url) -sb.cdp.open(url) +sb.cdp.get(url, **kwargs) +sb.cdp.open(url, **kwargs) sb.cdp.reload(ignore_cache=True, script_to_evaluate_on_load=None) sb.cdp.refresh() sb.cdp.get_event_loop() diff --git a/examples/cdp_mode/raw_tab_switching.py b/examples/cdp_mode/raw_tab_switching.py index 42e1e3bc7b4..11ee963e938 100644 --- a/examples/cdp_mode/raw_tab_switching.py +++ b/examples/cdp_mode/raw_tab_switching.py @@ -1,6 +1,6 @@ from seleniumbase import SB -with SB(uc=True) as sb: +with SB(uc=True, test=True) as sb: sb.activate_cdp_mode() sb.open("data:text/html,

Page A

") sb.assert_text("Page A") diff --git a/examples/cdp_mode/raw_timezone_sb.py b/examples/cdp_mode/raw_timezone_sb.py new file mode 100644 index 00000000000..b6abb116f8a --- /dev/null +++ b/examples/cdp_mode/raw_timezone_sb.py @@ -0,0 +1,13 @@ +"""An example of changing settings during CDP Mode""" +from seleniumbase import SB + +with SB(uc=True, test=True, pls="eager") as sb: + url = "https://www.randymajors.org/what-time-zone-am-i-in" + sb.activate_cdp_mode(url, tzone="Asia/Kolkata", geoloc=(26.863, 80.94)) + sb.remove_elements("#right-sidebar") + sb.remove_elements('[id*="Footer"]') + sb.sleep(5) + sb.cdp.open(url, tzone="Asia/Tokyo", geoloc=(35.050681, 136.844728)) + sb.remove_elements("#right-sidebar") + sb.remove_elements('[id*="Footer"]') + sb.sleep(5) diff --git a/help_docs/method_summary.md b/help_docs/method_summary.md index 42a1902b157..3ae410edfe1 100644 --- a/help_docs/method_summary.md +++ b/help_docs/method_summary.md @@ -679,7 +679,7 @@ self._print(TEXT) # Calls Python's print() / Allows for translations # (Mainly for CDP Mode) - (For all CDP methods, see the CDP Mode Docs) -self.activate_cdp_mode(url=None) # Activate CDP Mode on the given URL +self.activate_cdp_mode(url=None, **kwargs) # Activate CDP Mode on URL self.reconnect(timeout=0.1) # disconnect() + sleep(timeout) + connect() self.disconnect() # Stops the webdriver service to prevent detection self.connect() # Starts the webdriver service to allow actions again @@ -759,7 +759,7 @@ driver.uc_open(url) # (Open in same tab with default reconnect_time) driver.uc_open_with_tab(url) # (New tab with default reconnect_time) driver.uc_open_with_reconnect(url, reconnect_time=None) # (New tab) driver.uc_open_with_disconnect(url, timeout=None) # New tab + sleep() -driver.uc_activate_cdp_mode(url=None) # Activate CDP Mode on the given URL +driver.uc_activate_cdp_mode(url=None, **kwargs) # Activate CDP Mode on URL driver.reconnect(timeout=0.1) # disconnect() + sleep(timeout) + connect() driver.disconnect() # Stops the webdriver service to prevent detection driver.connect() # Starts the webdriver service to allow actions again diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 419cb6fa478..4f97fbfbf70 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.37.8" +__version__ = "4.37.9" diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index 7c90647f34d..c301734b015 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -515,7 +515,7 @@ def uc_open_with_reconnect(driver, url, reconnect_time=None): return None -def uc_open_with_cdp_mode(driver, url=None): +def uc_open_with_cdp_mode(driver, url=None, **kwargs): import asyncio from seleniumbase.undetected.cdp_driver import cdp_util @@ -607,7 +607,9 @@ def uc_open_with_cdp_mode(driver, url=None): loop.run_until_complete(page_tab.activate()) loop.run_until_complete(driver.cdp_base.update_targets()) - page = loop.run_until_complete(driver.cdp_base.get(url)) + page = loop.run_until_complete( + driver.cdp_base.get(url, **kwargs) + ) with gui_lock: with suppress(Exception): shared_utils.make_writable(constants.MultiBrowser.PYAUTOGUILOCK) @@ -792,8 +794,8 @@ def uc_open_with_cdp_mode(driver, url=None): driver._is_using_cdp = True -def uc_activate_cdp_mode(driver, url=None): - uc_open_with_cdp_mode(driver, url=url) +def uc_activate_cdp_mode(driver, url=None, **kwargs): + uc_open_with_cdp_mode(driver, url=url, **kwargs) def uc_open_with_disconnect(driver, url, timeout=None): diff --git a/seleniumbase/core/sb_cdp.py b/seleniumbase/core/sb_cdp.py index 9a3a9941456..e8578ead566 100644 --- a/seleniumbase/core/sb_cdp.py +++ b/seleniumbase/core/sb_cdp.py @@ -101,12 +101,12 @@ def __add_sync_methods(self, element): element.get_parent = lambda: self.__get_parent(element) return element - def get(self, url): + def get(self, url, **kwargs): url = shared_utils.fix_url_as_needed(url) driver = self.driver if hasattr(driver, "cdp_base"): driver = driver.cdp_base - self.loop.run_until_complete(self.page.get(url)) + self.loop.run_until_complete(self.page.get(url, **kwargs)) url_protocol = url.split(":")[0] safe_url = True if url_protocol not in ["about", "data", "chrome"]: @@ -120,8 +120,8 @@ def get(self, url): self.__slow_mode_pause_if_set() self.loop.run_until_complete(self.page.wait()) - def open(self, url): - self.get(url) + def open(self, url, **kwargs): + self.get(url, **kwargs) def reload(self, ignore_cache=True, script_to_evaluate_on_load=None): self.loop.run_until_complete( diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index 7e1c538fea2..48cfb9d4d47 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -4870,7 +4870,7 @@ def deactivate_design_mode(self, url=None): script = """document.designMode = 'off';""" self.execute_script(script) - def activate_cdp_mode(self, url=None): + def activate_cdp_mode(self, url=None, **kwargs): if hasattr(self.driver, "_is_using_uc") and self.driver._is_using_uc: if self.__is_cdp_swap_needed(): return # CDP Mode is already active @@ -4879,10 +4879,10 @@ def activate_cdp_mode(self, url=None): current_url = self.get_current_url() if not current_url.startswith(("about", "data", "chrome")): self.get_new_driver(undetectable=True) - self.driver.uc_open_with_cdp_mode(url) + self.driver.uc_open_with_cdp_mode(url, **kwargs) else: self.get_new_driver(undetectable=True) - self.driver.uc_open_with_cdp_mode(url) + self.driver.uc_open_with_cdp_mode(url, **kwargs) self.cdp = self.driver.cdp def activate_recorder(self): diff --git a/seleniumbase/undetected/cdp_driver/browser.py b/seleniumbase/undetected/cdp_driver/browser.py index e3e193ec122..72256be76cc 100644 --- a/seleniumbase/undetected/cdp_driver/browser.py +++ b/seleniumbase/undetected/cdp_driver/browser.py @@ -256,6 +256,7 @@ async def get( url="about:blank", new_tab: bool = False, new_window: bool = False, + **kwargs, ) -> tab.Tab: """Top level get. Utilizes the first tab to retrieve given url. Convenience function known from selenium. @@ -309,6 +310,26 @@ async def get( and sb_config._cdp_geolocation ): _cdp_geolocation = sb_config._cdp_geolocation + if "timezone" in kwargs: + _cdp_timezone = kwargs["timezone"] + elif "tzone" in kwargs: + _cdp_timezone = kwargs["tzone"] + if "user_agent" in kwargs: + _cdp_user_agent = kwargs["user_agent"] + elif "agent" in kwargs: + _cdp_user_agent = kwargs["agent"] + if "locale" in kwargs: + _cdp_locale = kwargs["locale"] + elif "lang" in kwargs: + _cdp_locale = kwargs["lang"] + if "platform" in kwargs: + _cdp_platform = kwargs["platform"] + elif "plat" in kwargs: + _cdp_platform = kwargs["plat"] + if "geolocation" in kwargs: + _cdp_geolocation = kwargs["geolocation"] + elif "geoloc" in kwargs: + _cdp_geolocation = kwargs["geoloc"] if _cdp_timezone: await connection.send(cdp.page.navigate("about:blank")) await connection.set_timezone(_cdp_timezone) diff --git a/seleniumbase/undetected/cdp_driver/cdp_util.py b/seleniumbase/undetected/cdp_driver/cdp_util.py index a50ae3d43a6..8013b340645 100644 --- a/seleniumbase/undetected/cdp_driver/cdp_util.py +++ b/seleniumbase/undetected/cdp_driver/cdp_util.py @@ -383,6 +383,10 @@ async def start( sb_config._cdp_user_agent = None if "platform" in kwargs: sb_config._cdp_platform = kwargs["platform"] + elif "plat" in kwargs: + sb_config._cdp_platform = kwargs["plat"] + else: + sb_config._cdp_platform = None return driver diff --git a/seleniumbase/undetected/cdp_driver/tab.py b/seleniumbase/undetected/cdp_driver/tab.py index fc6988e25ec..5bc4804f375 100644 --- a/seleniumbase/undetected/cdp_driver/tab.py +++ b/seleniumbase/undetected/cdp_driver/tab.py @@ -338,6 +338,7 @@ async def get( url="about:blank", new_tab: bool = False, new_window: bool = False, + **kwargs, ): """ Top level get. Utilizes the first tab to retrieve the given url. @@ -359,14 +360,23 @@ async def get( if new_tab: if hasattr(sb_config, "incognito") and sb_config.incognito: return await self.browser.get( - url, new_tab=False, new_window=True + url, new_tab=False, new_window=True, **kwargs ) else: - return await self.browser.get(url, new_tab, new_window) + return await self.browser.get( + url, new_tab, new_window, **kwargs + ) else: - frame_id, loader_id, *_ = await self.send(cdp.page.navigate(url)) - await self - return self + if not kwargs: + frame_id, loader_id, *_ = await self.send( + cdp.page.navigate(url) + ) + await self + return self + else: + return await self.browser.get( + url, new_tab, new_window, **kwargs + ) async def query_selector_all( self,