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"