Skip to content

Commit 2bbb3c3

Browse files
authored
Merge pull request #3252 from seleniumbase/cdp-mode-patch-9
CDP Mode - Patch 9
2 parents 44ba6a0 + bf13cc7 commit 2bbb3c3

File tree

10 files changed

+98
-20
lines changed

10 files changed

+98
-20
lines changed

examples/cdp_mode/ReadMe.md

+3
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,9 @@ sb.cdp.get_element_attribute(selector, attribute)
368368
sb.cdp.get_element_html(selector)
369369
sb.cdp.set_locale(locale)
370370
sb.cdp.set_attributes(selector, attribute, value)
371+
sb.cdp.gui_press_key(key)
372+
sb.cdp.gui_press_keys(keys)
373+
sb.cdp.gui_write(text)
371374
sb.cdp.gui_click_x_y(x, y)
372375
sb.cdp.gui_click_element(selector)
373376
sb.cdp.internalize_links()

examples/cdp_mode/raw_albertsons.py

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from seleniumbase import SB
2+
3+
with SB(uc=True, test=True, locale_code="en") as sb:
4+
url = "https://www.albertsons.com/recipes/"
5+
sb.activate_cdp_mode(url)
6+
sb.sleep(2.5)
7+
sb.remove_element("div > div > article")
8+
sb.cdp.scroll_into_view('input[type="search"]')
9+
sb.cdp.click_if_visible("button.banner-close-button")
10+
sb.cdp.click("input#search-suggestion-input")
11+
sb.sleep(0.2)
12+
search = "Avocado Smoked Salmon"
13+
required_text = "Salmon"
14+
sb.cdp.press_keys("input#search-suggestion-input", search)
15+
sb.sleep(0.8)
16+
sb.cdp.click("#suggestion-0 a span")
17+
sb.sleep(3.2)
18+
sb.cdp.click_if_visible("button.banner-close-button")
19+
sb.sleep(1.2)
20+
print('*** Albertsons Search for "%s":' % search)
21+
print(' (Results must contain "%s".)' % required_text)
22+
unique_item_text = []
23+
item_selector = 'a[href*="/meal-plans-recipes/shop/"]'
24+
info_selector = 'span[data-test-id*="recipe-thumb-title"]'
25+
items = sb.cdp.find_elements("%s %s" % (item_selector, info_selector))
26+
for item in items:
27+
sb.sleep(0.03)
28+
item.scroll_into_view()
29+
sb.sleep(0.025)
30+
if required_text in item.text:
31+
item.flash()
32+
sb.sleep(0.025)
33+
if item.text not in unique_item_text:
34+
unique_item_text.append(item.text)
35+
print("* " + item.text)

requirements.txt

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
pip>=24.2
2-
packaging>=24.1
2+
packaging>=24.2
33
setuptools~=70.2;python_version<"3.10"
44
setuptools>=73.0.1;python_version>="3.10"
5-
wheel>=0.44.0
5+
wheel>=0.45.0
66
attrs>=24.2.0
77
certifi>=2024.8.30
88
exceptiongroup>=1.2.2
9-
websockets>=13.1
9+
websockets~=13.1;python_version<"3.9"
10+
websockets>=14.0;python_version>="3.9"
1011
filelock>=3.16.1
1112
fasteners>=0.19
1213
mycdp>=1.0.1

seleniumbase/__version__.py

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

seleniumbase/core/browser_launcher.py

+6
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,9 @@ def uc_open_with_cdp_mode(driver, url=None):
620620
cdp.reset_window_size = CDPM.reset_window_size
621621
cdp.set_locale = CDPM.set_locale
622622
cdp.set_attributes = CDPM.set_attributes
623+
cdp.gui_press_key = CDPM.gui_press_key
624+
cdp.gui_press_keys = CDPM.gui_press_keys
625+
cdp.gui_write = CDPM.gui_write
623626
cdp.gui_click_x_y = CDPM.gui_click_x_y
624627
cdp.gui_click_element = CDPM.gui_click_element
625628
cdp.internalize_links = CDPM.internalize_links
@@ -721,6 +724,9 @@ def uc_click(
721724
timeout=settings.SMALL_TIMEOUT,
722725
reconnect_time=None,
723726
):
727+
if __is_cdp_swap_needed(driver):
728+
driver.cdp.click(selector)
729+
return
724730
with suppress(Exception):
725731
rct = float(by) # Add shortcut: driver.uc_click(selector, RCT)
726732
if not reconnect_time:

seleniumbase/core/sb_cdp.py

+39
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,45 @@ def __get_configured_pyautogui(self, pyautogui_copy):
942942
)
943943
return pyautogui_copy
944944

945+
def gui_press_key(self, key):
946+
self.__install_pyautogui_if_missing()
947+
import pyautogui
948+
pyautogui = self.__get_configured_pyautogui(pyautogui)
949+
gui_lock = fasteners.InterProcessLock(
950+
constants.MultiBrowser.PYAUTOGUILOCK
951+
)
952+
with gui_lock:
953+
pyautogui.press(key)
954+
time.sleep(0.0375)
955+
self.__slow_mode_pause_if_set()
956+
self.loop.run_until_complete(self.page.wait())
957+
958+
def gui_press_keys(self, keys):
959+
self.__install_pyautogui_if_missing()
960+
import pyautogui
961+
pyautogui = self.__get_configured_pyautogui(pyautogui)
962+
gui_lock = fasteners.InterProcessLock(
963+
constants.MultiBrowser.PYAUTOGUILOCK
964+
)
965+
with gui_lock:
966+
for key in keys:
967+
pyautogui.press(key)
968+
time.sleep(0.0375)
969+
self.__slow_mode_pause_if_set()
970+
self.loop.run_until_complete(self.page.wait())
971+
972+
def gui_write(self, text):
973+
self.__install_pyautogui_if_missing()
974+
import pyautogui
975+
pyautogui = self.__get_configured_pyautogui(pyautogui)
976+
gui_lock = fasteners.InterProcessLock(
977+
constants.MultiBrowser.PYAUTOGUILOCK
978+
)
979+
with gui_lock:
980+
pyautogui.write(text)
981+
self.__slow_mode_pause_if_set()
982+
self.loop.run_until_complete(self.page.wait())
983+
945984
def __gui_click_x_y(self, x, y, timeframe=0.25, uc_lock=False):
946985
self.__install_pyautogui_if_missing()
947986
import pyautogui

seleniumbase/plugins/driver_manager.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -550,11 +550,7 @@ def Driver(
550550
or uc_sub
551551
):
552552
undetectable = True
553-
if (
554-
(undetectable or undetected or uc)
555-
and (uc_subprocess is None)
556-
and (uc_sub is None)
557-
):
553+
if undetectable or undetected or uc:
558554
uc_subprocess = True # Use UC as a subprocess by default.
559555
elif (
560556
"--undetectable" in sys_argv

seleniumbase/plugins/sb_manager.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -608,11 +608,7 @@ def SB(
608608
or uc_sub
609609
):
610610
undetectable = True
611-
if (
612-
(undetectable or undetected or uc)
613-
and (uc_subprocess is None)
614-
and (uc_sub is None)
615-
):
611+
if undetectable or undetected or uc:
616612
uc_subprocess = True # Use UC as a subprocess by default.
617613
elif (
618614
"--undetectable" in sys_argv

seleniumbase/undetected/cdp_driver/connection.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
TypeVar,
1919
)
2020
import websockets
21+
from websockets.protocol import State
2122
from . import cdp_util as util
2223
import mycdp as cdp
2324
import mycdp.network
@@ -261,7 +262,7 @@ async def aopen(self, **kw):
261262
"""
262263
Opens the websocket connection. Shouldn't be called manually by users.
263264
"""
264-
if not self.websocket or self.websocket.closed:
265+
if not self.websocket or self.websocket.state is State.CLOSED:
265266
try:
266267
self.websocket = await websockets.connect(
267268
self.websocket_url,
@@ -288,7 +289,7 @@ async def aclose(self):
288289
"""
289290
Closes the websocket connection. Shouldn't be called manually by users.
290291
"""
291-
if self.websocket and not self.websocket.closed:
292+
if self.websocket and self.websocket.state is not State.CLOSED:
292293
if self.listener and self.listener.running:
293294
self.listener.cancel()
294295
self.enabled_domains.clear()
@@ -393,7 +394,7 @@ async def send(
393394
when multiple calls to connection.send() are made.
394395
"""
395396
await self.aopen()
396-
if not self.websocket or self.closed:
397+
if not self.websocket or self.websocket.state is State.CLOSED:
397398
return
398399
if self._owner:
399400
browser = self._owner

setup.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,15 @@
148148
python_requires=">=3.8",
149149
install_requires=[
150150
'pip>=24.2',
151-
'packaging>=24.1',
151+
'packaging>=24.2',
152152
'setuptools~=70.2;python_version<"3.10"', # Newer ones had issues
153153
'setuptools>=73.0.1;python_version>="3.10"',
154-
'wheel>=0.44.0',
154+
'wheel>=0.45.0',
155155
'attrs>=24.2.0',
156156
"certifi>=2024.8.30",
157157
"exceptiongroup>=1.2.2",
158-
"websockets>=13.1",
158+
'websockets~=13.1;python_version<"3.9"',
159+
'websockets>=14.0;python_version>="3.9"',
159160
'filelock>=3.16.1',
160161
'fasteners>=0.19',
161162
"mycdp>=1.0.1",

0 commit comments

Comments
 (0)