Skip to content

Commit 4ff04c0

Browse files
authored
Merge pull request #3603 from seleniumbase/cdp-mode-patch-42
CDP Mode: Patch 42
2 parents 747d6f6 + 3792283 commit 4ff04c0

File tree

9 files changed

+72
-12
lines changed

9 files changed

+72
-12
lines changed

README.md

+5-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
1313

14-
1514
<p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
1615

1716
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a></p>
@@ -54,7 +53,9 @@
5453
<br />
5554
</p>
5655

57-
<p>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</p>
56+
<p align="center"><a href="https://trendshift.io/repositories/12493" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2FSeleniumBase | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></p>
57+
58+
<p>SeleniumBase is the professional toolkit for web automation. Built for testing websites, bypassing CAPTCHAs, completing tasks, and scaling your business.</p>
5859

5960
--------
6061

@@ -81,7 +82,7 @@ with SB(test=True, uc=True) as sb:
8182

8283
> `python raw_google.py`
8384
84-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="420" /></a>
85+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
8586

8687
--------
8788

@@ -1393,5 +1394,5 @@ pytest --reruns=1 --reruns-delay=1
13931394
<div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a></div>
13941395
<div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
13951396
<div><a href="https://hellogithub.com/repository/c6be2d0f1969448697683d11a4ff915e" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=c6be2d0f1969448697683d11a4ff915e&claim_uid=xcrm4p9j3d6JCO5&theme=small" alt="Featured|HelloGitHub" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
1396-
<div><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1397+
<div><a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
13971398
<div align="left"></div>

examples/cdp_mode/ReadMe.md

+5
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ sb.cdp.send_keys(selector, text, timeout=None)
413413
sb.cdp.press_keys(selector, text, timeout=None)
414414
sb.cdp.type(selector, text, timeout=None)
415415
sb.cdp.set_value(selector, text, timeout=None)
416+
sb.cdp.submit(selector)
416417
sb.cdp.evaluate(expression)
417418
sb.cdp.js_dumps(obj_name)
418419
sb.cdp.maximize()
@@ -438,6 +439,8 @@ sb.cdp.get_page_source()
438439
sb.cdp.get_user_agent()
439440
sb.cdp.get_cookie_string()
440441
sb.cdp.get_locale_code()
442+
sb.cdp.get_local_storage_item(key)
443+
sb.cdp.get_session_storage_item(key)
441444
sb.cdp.get_screen_rect()
442445
sb.cdp.get_window_rect()
443446
sb.cdp.get_window_size()
@@ -454,6 +457,8 @@ sb.cdp.get_element_attribute(selector, attribute)
454457
sb.cdp.get_attribute(selector, attribute)
455458
sb.cdp.get_element_html(selector)
456459
sb.cdp.set_locale(locale)
460+
sb.cdp.set_local_storage_item(key, value)
461+
sb.cdp.set_session_storage_item(key, value)
457462
sb.cdp.set_attributes(selector, attribute, value)
458463
sb.cdp.gui_press_key(key)
459464
sb.cdp.gui_press_keys(keys)

mkdocs_build/requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
regex>=2024.11.6
55
pymdown-extensions>=10.14.3
6-
pipdeptree>=2.25.0
6+
pipdeptree>=2.25.1
77
python-dateutil>=2.8.2
88
Markdown==3.7
99
click==8.1.8

requirements.txt

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
pip>=25.0.1
22
packaging>=24.2
33
setuptools~=70.2;python_version<"3.10"
4-
setuptools>=75.8.2;python_version>="3.10"
4+
setuptools>=76.0.0;python_version>="3.10"
55
wheel>=0.45.1
66
attrs>=25.1.0
77
certifi>=2025.1.31
@@ -11,7 +11,7 @@ websockets>=15.0.1;python_version>="3.9"
1111
filelock~=3.16.1;python_version<"3.9"
1212
filelock>=3.17.0;python_version>="3.9"
1313
fasteners>=0.19
14-
mycdp>=1.1.0
14+
mycdp>=1.1.1
1515
pynose>=1.5.4
1616
platformdirs>=4.3.6
1717
typing-extensions>=4.12.2
@@ -44,7 +44,8 @@ wsproto==1.2.0
4444
websocket-client==1.8.0
4545
selenium==4.27.1;python_version<"3.9"
4646
selenium==4.29.0;python_version>="3.9"
47-
cssselect==1.2.0
47+
cssselect==1.2.0;python_version<"3.9"
48+
cssselect==1.3.0;python_version>="3.9"
4849
sortedcontainers==2.4.0
4950
execnet==2.1.1
5051
iniconfig==2.0.0

seleniumbase/__version__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.35.6"
2+
__version__ = "4.35.7"

seleniumbase/core/browser_launcher.py

+5
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,7 @@ def uc_open_with_cdp_mode(driver, url=None):
662662
cdp.press_keys = CDPM.press_keys
663663
cdp.type = CDPM.type
664664
cdp.set_value = CDPM.set_value
665+
cdp.submit = CDPM.submit
665666
cdp.evaluate = CDPM.evaluate
666667
cdp.js_dumps = CDPM.js_dumps
667668
cdp.maximize = CDPM.maximize
@@ -670,6 +671,8 @@ def uc_open_with_cdp_mode(driver, url=None):
670671
cdp.set_window_rect = CDPM.set_window_rect
671672
cdp.reset_window_size = CDPM.reset_window_size
672673
cdp.set_locale = CDPM.set_locale
674+
cdp.set_local_storage_item = CDPM.set_local_storage_item
675+
cdp.set_session_storage_item = CDPM.set_session_storage_item
673676
cdp.set_attributes = CDPM.set_attributes
674677
cdp.gui_press_key = CDPM.gui_press_key
675678
cdp.gui_press_keys = CDPM.gui_press_keys
@@ -705,6 +708,8 @@ def uc_open_with_cdp_mode(driver, url=None):
705708
cdp.get_user_agent = CDPM.get_user_agent
706709
cdp.get_cookie_string = CDPM.get_cookie_string
707710
cdp.get_locale_code = CDPM.get_locale_code
711+
cdp.get_local_storage_item = CDPM.get_local_storage_item
712+
cdp.get_session_storage_item = CDPM.get_session_storage_item
708713
cdp.get_text = CDPM.get_text
709714
cdp.get_title = CDPM.get_title
710715
cdp.get_page_title = CDPM.get_title

seleniumbase/core/sb_cdp.py

+34
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,20 @@ def set_value(self, selector, text, timeout=None):
955955
self.__slow_mode_pause_if_set()
956956
self.loop.run_until_complete(self.page.sleep(0.025))
957957

958+
def submit(self, selector):
959+
submit_script = (
960+
"""elm = document.querySelector('%s');
961+
const event = new KeyboardEvent("keydown", {
962+
key: "Enter",
963+
keyCode: 13,
964+
code: "Enter",
965+
which: 13,
966+
bubbles: true
967+
});
968+
elm.dispatchEvent(event);""" % selector
969+
)
970+
self.loop.run_until_complete(self.page.evaluate(submit_script))
971+
958972
def evaluate(self, expression):
959973
"""Run a JavaScript expression and return the result."""
960974
expression = expression.strip()
@@ -1115,6 +1129,16 @@ def get_locale_code(self):
11151129
self.page.evaluate("navigator.language || navigator.languages[0]")
11161130
)
11171131

1132+
def get_local_storage_item(self, key):
1133+
js_code = """localStorage.getItem('%s');""" % key
1134+
with suppress(Exception):
1135+
return self.loop.run_until_complete(self.page.evaluate(js_code))
1136+
1137+
def get_session_storage_item(self, key):
1138+
js_code = """sessionStorage.getItem('%s');""" % key
1139+
with suppress(Exception):
1140+
return self.loop.run_until_complete(self.page.evaluate(js_code))
1141+
11181142
def get_screen_rect(self):
11191143
coordinates = self.loop.run_until_complete(
11201144
self.page.js_dumps("window.screen")
@@ -1302,6 +1326,16 @@ def set_locale(self, locale):
13021326
"""(Settings will take effect on the next page load)"""
13031327
self.loop.run_until_complete(self.page.set_locale(locale))
13041328

1329+
def set_local_storage_item(self, key, value):
1330+
js_code = """localStorage.setItem('%s','%s');""" % (key, value)
1331+
with suppress(Exception):
1332+
self.loop.run_until_complete(self.page.evaluate(js_code))
1333+
1334+
def set_session_storage_item(self, key, value):
1335+
js_code = """sessionStorage.setItem('%s','%s');""" % (key, value)
1336+
with suppress(Exception):
1337+
self.loop.run_until_complete(self.page.evaluate(js_code))
1338+
13051339
def set_attributes(self, selector, attribute, value):
13061340
"""This method uses JavaScript to set/update a common attribute.
13071341
All matching selectors from querySelectorAll() are used.

seleniumbase/fixtures/base_case.py

+13
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,9 @@ def submit(self, selector, by="css selector"):
11641164
"""Alternative to self.driver.find_element_by_*(SELECTOR).submit()"""
11651165
self.__check_scope()
11661166
selector, by = self.__recalculate_selector(selector, by)
1167+
if self.__is_cdp_swap_needed():
1168+
self.cdp.submit(selector)
1169+
return
11671170
element = self.wait_for_element_clickable(
11681171
selector, by=by, timeout=settings.SMALL_TIMEOUT
11691172
)
@@ -8800,6 +8803,9 @@ def set_local_storage_item(self, key, value):
88008803
self.__check_scope()
88018804
if not self.__is_valid_storage_url():
88028805
raise WebDriverException("Local Storage is not available here!")
8806+
if self.__is_cdp_swap_needed():
8807+
self.cdp.set_local_storage_item(key, value)
8808+
return
88038809
self.execute_script(
88048810
"window.localStorage.setItem('{}', '{}');".format(key, value)
88058811
)
@@ -8808,6 +8814,8 @@ def get_local_storage_item(self, key):
88088814
self.__check_scope()
88098815
if not self.__is_valid_storage_url():
88108816
raise WebDriverException("Local Storage is not available here!")
8817+
if self.__is_cdp_swap_needed():
8818+
return self.cdp.get_local_storage_item(key)
88118819
return self.execute_script(
88128820
"return window.localStorage.getItem('{}');".format(key)
88138821
)
@@ -8859,6 +8867,9 @@ def set_session_storage_item(self, key, value):
88598867
self.__check_scope()
88608868
if not self.__is_valid_storage_url():
88618869
raise WebDriverException("Session Storage is not available here!")
8870+
if self.__is_cdp_swap_needed():
8871+
self.cdp.set_session_storage_item(key, value)
8872+
return
88628873
self.execute_script(
88638874
"window.sessionStorage.setItem('{}', '{}');".format(key, value)
88648875
)
@@ -8867,6 +8878,8 @@ def get_session_storage_item(self, key):
88678878
self.__check_scope()
88688879
if not self.__is_valid_storage_url():
88698880
raise WebDriverException("Session Storage is not available here!")
8881+
if self.__is_cdp_swap_needed():
8882+
return self.cdp.get_session_storage_item(key)
88708883
return self.execute_script(
88718884
"return window.sessionStorage.getItem('{}');".format(key)
88728885
)

setup.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@
150150
'pip>=25.0.1',
151151
'packaging>=24.2',
152152
'setuptools~=70.2;python_version<"3.10"', # Newer ones had issues
153-
'setuptools>=75.8.2;python_version>="3.10"',
153+
'setuptools>=76.0.0;python_version>="3.10"',
154154
'wheel>=0.45.1',
155155
'attrs>=25.1.0',
156156
"certifi>=2025.1.31",
@@ -160,7 +160,7 @@
160160
'filelock~=3.16.1;python_version<"3.9"',
161161
'filelock>=3.17.0;python_version>="3.9"',
162162
'fasteners>=0.19',
163-
"mycdp>=1.1.0",
163+
"mycdp>=1.1.1",
164164
"pynose>=1.5.4",
165165
'platformdirs>=4.3.6',
166166
'typing-extensions>=4.12.2',
@@ -193,7 +193,8 @@
193193
'websocket-client==1.8.0',
194194
'selenium==4.27.1;python_version<"3.9"',
195195
'selenium==4.29.0;python_version>="3.9"',
196-
'cssselect==1.2.0',
196+
'cssselect==1.2.0;python_version<"3.9"',
197+
'cssselect==1.3.0;python_version>="3.9"',
197198
"sortedcontainers==2.4.0",
198199
'execnet==2.1.1',
199200
'iniconfig==2.0.0',

0 commit comments

Comments
 (0)