Skip to content

Commit b17615d

Browse files
authored
Merge pull request #4102 from seleniumbase/cdp-mode-patch-75
CDP Mode: Patch 75
2 parents f7442b9 + da6994e commit b17615d

File tree

14 files changed

+84
-49
lines changed

14 files changed

+84
-49
lines changed

examples/cdp_mode/ReadMe.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
4646
That disconnects WebDriver from Chrome (which prevents detection), and gives you access to `sb.cdp` methods (which don't trigger anti-bot checks).
4747

48+
> (**New:** Calling **`sb.open(url)`** from UC Mode also activates CDP Mode now.)
49+
4850
Simple example from [SeleniumBase/examples/cdp_mode/raw_gitlab.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py):
4951

5052
```python

examples/cdp_mode/raw_cdp_tabs.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from seleniumbase import sb_cdp
2+
3+
sb = sb_cdp.Chrome()
4+
sb.open("data:text/html,<h1>Page A</h1>")
5+
sb.assert_text("Page A")
6+
sb.open_new_tab()
7+
sb.open("data:text/html,<h1>Page B</h1>")
8+
sb.assert_text("Page B")
9+
sb.switch_to_tab(0)
10+
sb.assert_text("Page A")
11+
sb.assert_text_not_visible("Page B")
12+
sb.switch_to_tab(1)
13+
sb.assert_text("Page B")
14+
sb.assert_text_not_visible("Page A")
15+
sb.driver.stop()

examples/cdp_mode/raw_driver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import atexit
22
from seleniumbase import Driver
33

4-
driver = Driver(uc=True)
4+
driver = Driver(uc=True, guest=True)
55
atexit.register(driver.quit)
66
url = "www.planetminecraft.com/account"
7-
driver.uc_activate_cdp_mode(url)
7+
driver.activate_cdp_mode(url)
88
driver.sleep(1)
99
driver.solve_captcha()
1010
driver.wait_for_element_absent("input[disabled]")

examples/cdp_mode/raw_planetmc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from seleniumbase import SB
22

3-
with SB(uc=True, test=True) as sb:
3+
with SB(uc=True, test=True, guest=True) as sb:
44
url = "www.planetminecraft.com/account/sign_in/"
55
sb.activate_cdp_mode(url)
66
sb.sleep(1.2)

mkdocs_build/requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
# Minimum Python version: 3.10 (for generating docs only)
33

44
regex>=2025.11.3
5-
pymdown-extensions>=10.16.1
6-
pipdeptree>=2.29.0
5+
pymdown-extensions>=10.17.1
6+
pipdeptree>=2.30.0
77
python-dateutil>=2.8.2
88
Markdown==3.10
99
click==8.3.0

requirements.txt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ setuptools>=80.9.0;python_version>="3.10"
66
wheel>=0.45.1
77
attrs~=25.3.0;python_version<"3.9"
88
attrs>=25.4.0;python_version>="3.9"
9-
certifi>=2025.10.5
9+
certifi>=2025.11.12
1010
exceptiongroup>=1.3.0
1111
websockets~=13.1;python_version<"3.9"
1212
websockets>=15.0.1;python_version>="3.9"
@@ -48,7 +48,8 @@ trio==0.27.0;python_version<"3.9"
4848
trio>=0.31.0,<1;python_version>="3.9" and python_version<"3.10"
4949
trio>=0.32.0,<1;python_version>="3.10"
5050
trio-websocket~=0.12.2
51-
wsproto==1.2.0
51+
wsproto==1.2.0;python_version<"3.10"
52+
wsproto==1.3.1;python_version>="3.10"
5253
websocket-client~=1.8.0;python_version<"3.9"
5354
websocket-client~=1.9.0;python_version>="3.9"
5455
selenium==4.27.1;python_version<"3.9"
@@ -57,7 +58,8 @@ selenium==4.38.0;python_version>="3.10"
5758
cssselect==1.2.0;python_version<"3.9"
5859
cssselect==1.3.0;python_version>="3.9"
5960
sortedcontainers==2.4.0
60-
execnet==2.1.1
61+
execnet==2.1.1;python_version<"3.10"
62+
execnet==2.1.2;python_version>="3.10"
6163
iniconfig==2.1.0;python_version<"3.10"
6264
iniconfig==2.3.0;python_version>="3.10"
6365
pluggy==1.5.0;python_version<"3.9"

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.44.10"
2+
__version__ = "4.44.11"

seleniumbase/core/browser_launcher.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,14 +1410,10 @@ def _uc_gui_click_captcha(
14101410
and driver.is_element_present("%s div" % frame)
14111411
):
14121412
frame = "%s div" % frame
1413-
elif (
1414-
driver.is_element_present('[name*="cf-turnstile-"]')
1415-
and driver.is_element_present("#challenge-form div > div")
1416-
):
1413+
elif driver.is_element_present("#challenge-form div > div"):
14171414
frame = "#challenge-form div > div"
14181415
elif (
1419-
driver.is_element_present('[name*="cf-turnstile-"]')
1420-
and driver.is_element_present(
1416+
driver.is_element_present(
14211417
'[style="display: grid;"] div div'
14221418
)
14231419
):
@@ -1430,13 +1426,11 @@ def _uc_gui_click_captcha(
14301426
):
14311427
frame = '.spacer + div div:not([class])'
14321428
elif (
1433-
driver.is_element_present('[name*="cf-turnstile-"]')
1434-
and driver.is_element_present(".spacer div:not([class])")
1429+
driver.is_element_present(".spacer div:not([class])")
14351430
):
14361431
frame = ".spacer div:not([class])"
14371432
elif (
1438-
driver.is_element_present('script[src*="challenges.c"]')
1439-
and driver.is_element_present(
1433+
driver.is_element_present(
14401434
'[data-testid*="challenge-"] div'
14411435
)
14421436
):

seleniumbase/core/sb_cdp.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Add CDP methods to extend the driver"""
22
import asyncio
33
import fasteners
4+
import mycdp
45
import os
56
import random
67
import re
@@ -15,6 +16,7 @@
1516
from seleniumbase.fixtures import page_utils
1617
from seleniumbase.fixtures import shared_utils
1718
from seleniumbase.undetected.cdp_driver import cdp_util
19+
from seleniumbase.undetected.cdp_driver import tab as cdp_tab
1820

1921

2022
class CDPMethods():
@@ -1122,9 +1124,33 @@ def switch_to_newest_window(self):
11221124
self.switch_to_tab(-1)
11231125

11241126
def open_new_tab(self, url=None, switch_to=True):
1127+
driver = self.driver
11251128
if not isinstance(url, str):
11261129
url = "about:blank"
1127-
self.loop.run_until_complete(self.page.get(url, new_tab=True))
1130+
if hasattr(driver, "cdp_base"):
1131+
self.loop.run_until_complete(self.page.get(url, new_tab=True))
1132+
if switch_to:
1133+
self.switch_to_newest_tab()
1134+
return
1135+
1136+
target_id = self.loop.run_until_complete(
1137+
self.page.send(mycdp.target.create_target(url))
1138+
)
1139+
found_target = None
1140+
targets = self.loop.run_until_complete(
1141+
self.page.send(mycdp.target.get_targets())
1142+
)
1143+
for target in targets:
1144+
if str(target_id) in str(target):
1145+
found_target = target
1146+
break
1147+
if found_target:
1148+
tab_url = driver.tabs[0].websocket_url
1149+
pre_tab_url = tab_url.split("/page/")[0] + "/page/"
1150+
new_tab_url = pre_tab_url + target_id
1151+
new_tab = cdp_tab.Tab(new_tab_url, found_target, driver)
1152+
driver.targets.append(new_tab)
1153+
driver.tabs.append(new_tab)
11281154
if switch_to:
11291155
self.switch_to_newest_tab()
11301156

seleniumbase/core/sb_driver.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,11 +288,8 @@ def highlight(self, *args, **kwargs):
288288
selector = kwargs["selector"]
289289
else:
290290
selector = args[0]
291-
if ":contains(" not in selector:
292-
self.driver.cdp.highlight(selector)
293-
return
294-
else:
295-
self.driver.connect()
291+
self.driver.cdp.highlight(selector)
292+
return
296293
if "scroll" in kwargs:
297294
kwargs.pop("scroll")
298295
w_args = kwargs.copy()

0 commit comments

Comments
 (0)