Skip to content

Realtime fingerprint changing #3709

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions examples/cdp_mode/ReadMe.md
Original file line number Diff line number Diff line change
Expand Up @@ -361,8 +361,8 @@ with SB(uc=True, test=True, locale="en", pls="none") as sb:
### 🐙 <b translate="no">CDP Mode</b> 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()
Expand Down
2 changes: 1 addition & 1 deletion examples/cdp_mode/raw_tab_switching.py
Original file line number Diff line number Diff line change
@@ -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,<h1>Page A</h1>")
sb.assert_text("Page A")
Expand Down
13 changes: 13 additions & 0 deletions examples/cdp_mode/raw_timezone_sb.py
Original file line number Diff line number Diff line change
@@ -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)
4 changes: 2 additions & 2 deletions help_docs/method_summary.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion seleniumbase/__version__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# seleniumbase package
__version__ = "4.37.8"
__version__ = "4.37.9"
10 changes: 6 additions & 4 deletions seleniumbase/core/browser_launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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):
Expand Down
8 changes: 4 additions & 4 deletions seleniumbase/core/sb_cdp.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]:
Expand All @@ -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(
Expand Down
6 changes: 3 additions & 3 deletions seleniumbase/fixtures/base_case.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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):
Expand Down
21 changes: 21 additions & 0 deletions seleniumbase/undetected/cdp_driver/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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)
Expand Down
4 changes: 4 additions & 0 deletions seleniumbase/undetected/cdp_driver/cdp_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
20 changes: 15 additions & 5 deletions seleniumbase/undetected/cdp_driver/tab.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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,
Expand Down