Skip to content

CDP Mode - Patch 28 #3467

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 5 commits into from
Feb 1, 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
27 changes: 27 additions & 0 deletions examples/cdp_mode/raw_cdp_drivers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# An example of switching between multiple drivers
from seleniumbase import SB

with SB(uc=True, test=True) as sb:
url1 = "https://seleniumbase.io/antibot/login"
sb.activate_cdp_mode(url1)
url2 = "https://seleniumbase.io/hobbit/login"
driver2 = sb.get_new_driver(undetectable=True)
sb.activate_cdp_mode(url2)
sb.sleep(1)
sb.switch_to_default_driver()
sb.assert_url_contains("antibot")
print(sb.get_current_url())
sb.type("input#username", "demo_user")
sb.type("input#password", "secret_pass")
sb.cdp.gui_click_element("button")
sb.sleep(1)
sb.cdp.gui_click_element("a#log-in")
sb.assert_text("Welcome!", "h1")
sb.sleep(2)
sb.switch_to_driver(driver2)
sb.assert_url_contains("hobbit")
print(sb.get_current_url())
sb.cdp.gui_click_element("button")
sb.assert_text("Welcome to Middle Earth!")
sb.click("img")
sb.sleep(3)
14 changes: 14 additions & 0 deletions examples/multiple_cdp_drivers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from seleniumbase import BaseCase
BaseCase.main(__name__, __file__, "--uc")


class MultipleDriversTest(BaseCase):
def test_multiple_drivers(self):
url1 = "https://seleniumbase.io/demo_page"
self.activate_cdp_mode(url1)
driver1 = self.driver
url2 = "https://seleniumbase.io/coffee/"
driver2 = self.get_new_driver(undetectable=True)
self.activate_cdp_mode(url2)
print("\n" + driver1.get_current_url())
print(driver2.get_current_url())
17 changes: 17 additions & 0 deletions examples/raw_cdp_drivers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from seleniumbase import SB

with SB(uc=True, test=True) as sb:
url1 = "https://seleniumbase.io/demo_page"
sb.activate_cdp_mode(url1)
driver1 = sb.driver
url2 = "https://seleniumbase.io/coffee/"
driver2 = sb.get_new_driver(undetectable=True)
sb.activate_cdp_mode(url2)
print(driver1.get_current_url())
print(driver2.get_current_url())
sb.switch_to_default_driver()
sb.assert_url_contains("demo_page")
print(sb.get_current_url())
sb.switch_to_driver(driver2)
sb.assert_url_contains("coffee")
print(sb.get_current_url())
6 changes: 3 additions & 3 deletions mkdocs_build/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Minimum Python version: 3.9 (for generating docs only)

regex>=2024.11.6
pymdown-extensions>=10.14.2
pymdown-extensions>=10.14.3
pipdeptree>=2.25.0
python-dateutil>=2.8.2
Markdown==3.7
Expand All @@ -11,10 +11,10 @@ ghp-import==2.1.0
watchdog==6.0.0
cairocffi==1.7.1
pathspec==0.12.1
Babel==2.16.0
Babel==2.17.0
paginate==0.5.7
mkdocs==1.6.1
mkdocs-material==9.5.50
mkdocs-material==9.6.1
mkdocs-exclude-search==0.6.6
mkdocs-simple-hooks==0.1.5
mkdocs-material-extensions==1.3.1
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ setuptools~=70.2;python_version<"3.10"
setuptools>=75.8.0;python_version>="3.10"
wheel>=0.45.1
attrs>=25.1.0
certifi>=2024.12.14
certifi>=2025.1.31
exceptiongroup>=1.2.2
websockets~=13.1;python_version<"3.9"
websockets>=14.2;python_version>="3.9"
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.34.4"
__version__ = "4.34.5"
1 change: 1 addition & 0 deletions seleniumbase/core/browser_launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -749,6 +749,7 @@ def uc_open_with_cdp_mode(driver, url=None):
core_items.browser = cdp.browser
core_items.tab = cdp.tab
core_items.util = cdp.util
cdp._swap_driver = CDPM._swap_driver
cdp.core = core_items
cdp.loop = cdp.get_event_loop()
driver.cdp = cdp
Expand Down
5 changes: 5 additions & 0 deletions seleniumbase/core/sb_cdp.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ def __init__(self, loop, page, driver):
self.page = page
self.driver = driver

def _swap_driver(self, driver):
self.driver = driver
self.page = driver.cdp.page
self.loop = driver.cdp.loop

def __slow_mode_pause_if_set(self):
if (
(hasattr(sb_config, "demo_mode") and sb_config.demo_mode)
Expand Down
4 changes: 4 additions & 0 deletions seleniumbase/fixtures/base_case.py
Original file line number Diff line number Diff line change
Expand Up @@ -4358,6 +4358,8 @@ def switch_to_driver(self, driver):
self.driver = driver
if self.driver in self._drivers_browser_map:
self.browser = self._drivers_browser_map[self.driver]
if self.__is_cdp_swap_needed():
self.cdp._swap_driver(self.driver)
self.bring_active_window_to_front()

def switch_to_default_driver(self):
Expand All @@ -4366,6 +4368,8 @@ def switch_to_default_driver(self):
self.driver = self._default_driver
if self.driver in self._drivers_browser_map:
self.browser = self._drivers_browser_map[self.driver]
if self.__is_cdp_swap_needed():
self.cdp._swap_driver(self.driver)
self.bring_active_window_to_front()

def save_screenshot(
Expand Down
17 changes: 16 additions & 1 deletion seleniumbase/undetected/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"CDP",
"find_chrome_executable",
)
IS_MAC = "darwin" in sys.platform
IS_POSIX = sys.platform.startswith(("darwin", "cygwin", "linux"))
logger = logging.getLogger("uc")
logger.setLevel(logging.getLogger().getEffectiveLevel())
Expand Down Expand Up @@ -311,7 +312,21 @@ def __init__(
setattr(service_, "creationflags", creationflags)
if hasattr(service_, "creation_flags"):
setattr(service_, "creation_flags", creationflags)
super().__init__(options=options, service=service_)
try:
super().__init__(options=options, service=service_)
except OSError as e:
if IS_MAC and "Bad CPU type in executable" in str(e):
print(str(e))
message = (
"Missing a macOS dependency:\n"
"Your Mac needs Rosetta 2 to use UC Mode!\n"
'Run: "softwareupdate --install-rosetta"\n'
"Info: "
"https://apple.stackexchange.com/a/408379/607628"
)
raise Exception(message)
else:
raise
self.reactor = None
if enable_cdp_events:
if logging.getLogger().getEffectiveLevel() == logging.DEBUG:
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@
'setuptools>=75.8.0;python_version>="3.10"',
'wheel>=0.45.1',
'attrs>=25.1.0',
"certifi>=2024.12.14",
"certifi>=2025.1.31",
"exceptiongroup>=1.2.2",
'websockets~=13.1;python_version<"3.9"',
'websockets>=14.2;python_version>="3.9"',
Expand Down