From 9954e1df1c17fd33a95999a78e011506d3e7bcc5 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 3 Aug 2026 16:31:50 -0400 Subject: [PATCH 1/5] Fix non-authenticated proxy in the sb_cdp format --- seleniumbase/undetected/cdp_driver/cdp_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seleniumbase/undetected/cdp_driver/cdp_util.py b/seleniumbase/undetected/cdp_driver/cdp_util.py index 8530df8250d..fad824e3c39 100644 --- a/seleniumbase/undetected/cdp_driver/cdp_util.py +++ b/seleniumbase/undetected/cdp_driver/cdp_util.py @@ -607,7 +607,7 @@ async def start( proxy_scheme, ) elif proxy: - proxy = proxy_helper.validate_proxy_string(proxy_string) + proxy = proxy_helper.validate_proxy_string(proxy) if "binary_location" in kwargs and not browser_executable_path: browser_executable_path = kwargs["binary_location"] if not user_data_dir and "--user-data-dir" in arg_join: From 35bad5b60b1f47a54a129d8aeb01ac0dcabadccd Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 3 Aug 2026 17:07:12 -0400 Subject: [PATCH 2/5] Refresh Python dependencies --- mkdocs_build/requirements.txt | 4 ++-- requirements.txt | 11 ++++++----- setup.py | 15 ++++++++------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/mkdocs_build/requirements.txt b/mkdocs_build/requirements.txt index d6679e08474..5ab22ff43f3 100644 --- a/mkdocs_build/requirements.txt +++ b/mkdocs_build/requirements.txt @@ -3,10 +3,10 @@ regex>=2026.7.19 pymdown-extensions>=10.21.3 -pipdeptree>=4.1.0 +pipdeptree>=4.2.0 python-dateutil>=2.8.2 click>=8.4.2 -Markdown==3.10.2 +Markdown==3.10.3 ghp-import==2.1.0 watchdog==6.0.0 cairocffi==1.7.1 diff --git a/requirements.txt b/requirements.txt index 3d14832c0a7..2de612f723f 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ pip>=26.0.1;python_version<"3.10" -pip>=26.1.2;python_version>="3.10" +pip>=26.2;python_version>="3.10" packaging>=26.2 setuptools~=70.2;python_version<"3.10" setuptools>=83.0.0;python_version>="3.10" @@ -8,9 +8,10 @@ attrs>=26.1.0 certifi>=2026.7.22 exceptiongroup>=1.3.1 websockets~=15.0.1;python_version<"3.10" -websockets>=16.1.1;python_version>="3.10" +websockets~=16.1.1;python_version=="3.10" +websockets>=17.0.1;python_version>="3.11" filelock~=3.19.1;python_version<"3.10" -filelock>=3.32.0;python_version>="3.10" +filelock>=3.32.2;python_version>="3.10" fasteners>=0.20 mycdp>=1.4.0 pynose>=1.5.5 @@ -48,7 +49,7 @@ websocket-client~=1.9.0 selenium==4.32.0;python_version<"3.10" selenium==4.46.0;python_version>="3.10" cssselect==1.3.0;python_version<"3.10" -cssselect>=1.4.0,<2;python_version>="3.10" +cssselect>=1.5.0,<2;python_version>="3.10" sortedcontainers==2.4.0 execnet==2.1.1;python_version<"3.10" execnet==2.1.2;python_version>="3.10" @@ -81,7 +82,7 @@ rich>=15.0.0,<16 # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.) coverage>=7.10.7;python_version<"3.10" -coverage>=7.15.2;python_version>="3.10" +coverage>=7.15.3;python_version>="3.10" pytest-cov>=7.1.0 flake8==7.3.0 mccabe==0.7.0 diff --git a/setup.py b/setup.py index 10873e9cc2d..a8fb145f509 100755 --- a/setup.py +++ b/setup.py @@ -163,7 +163,7 @@ python_requires=">=3.9", install_requires=[ 'pip>=26.0.1;python_version<"3.10"', - 'pip>=26.1.2;python_version>="3.10"', + 'pip>=26.2;python_version>="3.10"', 'packaging>=26.2', 'setuptools~=70.2;python_version<"3.10"', # Newer ones had issues 'setuptools>=83.0.0;python_version>="3.10"', @@ -172,9 +172,10 @@ 'certifi>=2026.7.22', 'exceptiongroup>=1.3.1', 'websockets~=15.0.1;python_version<"3.10"', - 'websockets>=16.1.1;python_version>="3.10"', + 'websockets~=16.1.1;python_version=="3.10"', + 'websockets>=17.0.1;python_version>="3.11"', 'filelock~=3.19.1;python_version<"3.10"', - 'filelock>=3.32.0;python_version>="3.10"', + 'filelock>=3.32.2;python_version>="3.10"', 'fasteners>=0.20', 'mycdp>=1.4.0', 'pynose>=1.5.5', @@ -212,7 +213,7 @@ 'selenium==4.32.0;python_version<"3.10"', 'selenium==4.46.0;python_version>="3.10"', 'cssselect==1.3.0;python_version<"3.10"', - 'cssselect>=1.4.0,<2;python_version>="3.10"', + 'cssselect>=1.5.0,<2;python_version>="3.10"', 'sortedcontainers==2.4.0', 'execnet==2.1.1;python_version<"3.10"', 'execnet==2.1.2;python_version>="3.10"', @@ -254,7 +255,7 @@ # Usage: coverage run -m pytest; coverage html; coverage report "coverage": [ 'coverage>=7.10.7;python_version<"3.10"', - 'coverage>=7.15.2;python_version>="3.10"', + 'coverage>=7.15.3;python_version>="3.10"', 'pytest-cov>=7.1.0', ], # pip install -e .[flake8] @@ -275,7 +276,7 @@ "pdfminer": [ 'pdfminer.six==20251107;python_version<"3.10"', 'pdfminer.six==20260107;python_version>="3.10"', - 'cryptography==49.0.0', + 'cryptography==50.0.0', 'cffi==2.0.0;python_version<"3.10"', 'cffi==2.1.0;python_version>="3.10"', 'pycparser==2.23;python_version<"3.10"', @@ -303,7 +304,7 @@ # (For the Playwright integration.) "playwright": [ 'playwright>=1.60.0;python_version<"3.10"', - 'playwright>=1.61.0;python_version>="3.10"', + 'playwright>=1.62.0;python_version>="3.10"', 'greenlet>=3.2.5;python_version<"3.10"', 'greenlet>=3.5.4;python_version>="3.10"', ], From 2bac11ba394f8edff0fff591f34400c946c01c62 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 3 Aug 2026 17:16:22 -0400 Subject: [PATCH 3/5] Update CDP Mode examples --- .../cdp_mode/playwright/raw_clearcote_sync.py | 28 +++++++++++++++++++ examples/cdp_mode/raw_cdp_facebook.py | 17 +++++++++++ examples/cdp_mode/raw_facebook.py | 2 ++ examples/cdp_mode/raw_kohls.py | 2 +- 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 examples/cdp_mode/playwright/raw_clearcote_sync.py create mode 100644 examples/cdp_mode/raw_cdp_facebook.py diff --git a/examples/cdp_mode/playwright/raw_clearcote_sync.py b/examples/cdp_mode/playwright/raw_clearcote_sync.py new file mode 100644 index 00000000000..4e9d2ea67f2 --- /dev/null +++ b/examples/cdp_mode/playwright/raw_clearcote_sync.py @@ -0,0 +1,28 @@ +from playwright.sync_api import sync_playwright +from seleniumbase import sb_cdp + +sb = sb_cdp.Chrome() +endpoint_url = sb.get_endpoint_url() + +with sync_playwright() as p: + browser = p.chromium.connect_over_cdp(endpoint_url) + page = browser.contexts[0].pages[0] + page.goto("https://www.clearcotelabs.com/audit") + sb.click('button[aria-label="Marker 1"]') + sb.click('button[aria-label="Marker 2"]') + sb.click('button[aria-label="Marker 3"]') + sb.press_keys("input", "audit") + sb.set_value('input[type="range"]', "100") + sb.click_and_hold("button[data-interaction-hold]") + sb.select_option_by_text("select", "Mouse") + sb.click('button:contains("Run the audit")') + sb.sleep(6) + sb.assert_element("div.text-successText", timeout=8) + try: + sb.assert_text("100", "div.text-successText", timeout=5) + sb.highlight('div.text-successText:contains("100")') + print(" ✅ The browser fingerprint is clean! Score: 100") + except Exception: + score = sb.get_text("div.text-successText") + print(f" ❌ Fingerprint tampering detected! Score: {score}") + sb.sleep(1) diff --git a/examples/cdp_mode/raw_cdp_facebook.py b/examples/cdp_mode/raw_cdp_facebook.py new file mode 100644 index 00000000000..f59993ec198 --- /dev/null +++ b/examples/cdp_mode/raw_cdp_facebook.py @@ -0,0 +1,17 @@ +from seleniumbase import sb_cdp + +sb = sb_cdp.Chrome(ad_block=True) +sb.goto("https://www.facebook.com/SeleniumBase") +sb.sleep(3) +sb.click_if_visible('[aria-label="Close"] i', timeout=2) +sb.sleep(1) +sb.click_if_visible('[aria-label="Close"] i') +for i in range(18): + sb.scroll_down(14) + sb.sleep(0.12) +print(sb.get_page_title()) +sb.save_as_pdf_to_logs() +sb.save_page_source_to_logs() +sb.save_screenshot_to_logs() +print("Logs have been saved to: ./latest_logs/") +sb.quit() diff --git a/examples/cdp_mode/raw_facebook.py b/examples/cdp_mode/raw_facebook.py index c860afbeddc..45104119ee6 100644 --- a/examples/cdp_mode/raw_facebook.py +++ b/examples/cdp_mode/raw_facebook.py @@ -2,10 +2,12 @@ with SB(uc=True, test=True, ad_block=True) as sb: sb.activate_cdp_mode() + sb.sleep(3) sb.goto("https://www.facebook.com/SeleniumBase") sb.sleep(1) sb.click_if_visible('[aria-label="Close"] i', timeout=2) sb.sleep(1) + sb.click_if_visible('[aria-label="Close"] i') for i in range(18): sb.scroll_down(14) print(sb.get_page_title()) diff --git a/examples/cdp_mode/raw_kohls.py b/examples/cdp_mode/raw_kohls.py index f4836b3bab1..07a92b6a650 100644 --- a/examples/cdp_mode/raw_kohls.py +++ b/examples/cdp_mode/raw_kohls.py @@ -1,6 +1,6 @@ from seleniumbase import SB -with SB(uc=True, test=True, locale="en", incognito=True) as sb: +with SB(uc=True, test=True, locale="en") as sb: search = "Mickey Mouse Blanket" req_1 = "Mickey" req_2 = "Blanket" From fdc69fb75566b762501839e04ce941ab2de850f7 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 3 Aug 2026 17:17:04 -0400 Subject: [PATCH 4/5] Update the docs --- help_docs/ReadMe.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/help_docs/ReadMe.md b/help_docs/ReadMe.md index e38f6c5ef04..3b84b74897d 100644 --- a/help_docs/ReadMe.md +++ b/help_docs/ReadMe.md @@ -23,7 +23,7 @@ 🔠 Syntax Formats | 🤖 CI/CD
-♻️ Boilerplates | +♻️ Boilerplates | 🗾 Locale Codes
🟨 JS Manager | @@ -35,15 +35,15 @@ 🔴 Recorder | 🖥️ Device Farm
-🎭 Stealthy Playwright Mode +🎭 Stealthy Playwright Mode
🎞️ Slides | 📶 Chart Maker
-🎖️ GUI | -👤 UC Mode +🎖️ GUI | +👤 UC Mode
-📘 Stealth API +📘 Stealth API
🐙 CDP Mode

From ba6cd245388c77c9cc2d0d8f4a835f7885eda808 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 3 Aug 2026 17:17:23 -0400 Subject: [PATCH 5/5] Version 4.51.9 --- seleniumbase/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index db84d6ce6e1..a71768509c1 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.51.8" +__version__ = "4.51.9"