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,