Skip to content

Commit 8317bc8

Browse files
authored
Merge pull request #3550 from seleniumbase/cdp-mode-patch-36
CDP Mode: Patch 36
2 parents 131bd70 + 4974aef commit 8317bc8

13 files changed

+117
-68
lines changed

examples/cdp_mode/ReadMe.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -328,11 +328,11 @@ with SB(uc=True, test=True, ad_block=True) as sb:
328328
```python
329329
from seleniumbase import SB
330330

331-
with SB(uc=True, test=True, locale_code="en", ad_block=True) as sb:
331+
with SB(uc=True, test=True, locale_code="en", pls="none") as sb:
332332
url = "https://www.nike.com/"
333333
sb.activate_cdp_mode(url)
334334
sb.sleep(2.5)
335-
sb.cdp.gui_click_element('div[data-testid="user-tools-container"]')
335+
sb.cdp.mouse_click('div[data-testid="user-tools-container"]')
336336
sb.sleep(1.5)
337337
search = "Nike Air Force 1"
338338
sb.cdp.press_keys('input[type="search"]', search)
@@ -470,6 +470,8 @@ sb.cdp.is_exact_text_visible(text, selector="body")
470470
sb.cdp.wait_for_text(text, selector="body", timeout=None)
471471
sb.cdp.wait_for_text_not_visible(text, selector="body", timeout=None)
472472
sb.cdp.wait_for_element_visible(selector, timeout=None)
473+
sb.cdp.wait_for_element_not_visible(selector, timeout=None)
474+
sb.cdp.wait_for_element_absent(selector, timeout=None)
473475
sb.cdp.assert_element(selector, timeout=None)
474476
sb.cdp.assert_element_visible(selector, timeout=None)
475477
sb.cdp.assert_element_present(selector, timeout=None)

examples/cdp_mode/raw_cdp_nike.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
page = loop.run_until_complete(driver.get(url))
99
sb = sb_cdp.CDPMethods(loop, page, driver)
1010

11-
search = "Nike Fly Shoes"
11+
search = "Road Racing Shoes"
1212
sb.click('div[data-testid="user-tools-container"]')
1313
sb.sleep(1)
1414
sb.press_keys('input[type="search"]', search)

examples/cdp_mode/raw_footlocker.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
sb.activate_cdp_mode(url)
66
sb.sleep(2.5)
77
sb.cdp.click_if_visible('button[id*="Agree"]')
8-
sb.sleep(2.5)
8+
sb.sleep(1.5)
99
sb.cdp.mouse_click('input[aria-label="Search"]')
10-
sb.sleep(2.5)
10+
sb.sleep(1.5)
1111
search = "Nike Shoes"
1212
sb.cdp.press_keys('input[aria-label="Search"]', search)
1313
sb.sleep(2.5)

examples/cdp_mode/raw_nike.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from seleniumbase import SB
22

3-
with SB(uc=True, test=True, locale_code="en", ad_block=True) as sb:
3+
with SB(uc=True, test=True, locale_code="en", pls="none") as sb:
44
url = "https://www.nike.com/"
55
sb.activate_cdp_mode(url)
66
sb.sleep(2.5)
7-
sb.cdp.gui_click_element('div[data-testid="user-tools-container"]')
7+
sb.cdp.mouse_click('div[data-testid="user-tools-container"]')
88
sb.sleep(1.5)
99
search = "Nike Air Force 1"
1010
sb.cdp.press_keys('input[type="search"]', search)

examples/cdp_mode/raw_res_nike.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ async def receive_handler(event: mycdp.network.ResponseReceived):
2525
print(event.response)
2626

2727

28-
with SB(uc=True, test=True, locale_code="en", ad_block=True) as sb:
28+
with SB(uc=True, test=True, locale_code="en", pls="none") as sb:
2929
url = "https://www.nike.com/"
3030
sb.activate_cdp_mode(url)
3131
sb.cdp.add_handler(mycdp.network.RequestWillBeSent, send_handler)
3232
sb.cdp.add_handler(mycdp.network.ResponseReceived, receive_handler)
3333
sb.sleep(2.5)
34-
sb.cdp.gui_click_element('div[data-testid="user-tools-container"]')
34+
sb.cdp.mouse_click('div[data-testid="user-tools-container"]')
3535
sb.sleep(1.5)
3636
search = "Nike Air Force 1"
3737
sb.cdp.press_keys('input[type="search"]', search)

examples/cdp_mode/raw_science.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from seleniumbase import SB
2+
3+
with SB(uc=True, incognito=True, test=True) as sb:
4+
url = "https://earth.esa.int/eogateway/search"
5+
sb.activate_cdp_mode(url)
6+
sb.sleep(1)
7+
sb.cdp.click_if_visible('button:contains("Accept cookies")')
8+
for i in range(20):
9+
sb.cdp.scroll_to_bottom()
10+
sb.cdp.click_if_visible('button:contains("READ MORE")')
11+
sb.sleep(1)
12+
elements = sb.cdp.find_elements("h4 a span")
13+
for element in elements:
14+
print(element.text)
15+
print("*** Total entries: %s" % len(elements))

examples/presenter/uc_presentation_4.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -838,11 +838,11 @@ def test_presentation_4(self):
838838
)
839839
self.begin_presentation(filename="uc_presentation.html")
840840

841-
with SB(uc=True, test=True, locale_code="en", ad_block=True) as sb:
841+
with SB(uc=True, test=True, locale_code="en", pls="none") as sb:
842842
url = "https://www.nike.com/"
843843
sb.activate_cdp_mode(url)
844844
sb.sleep(2.5)
845-
sb.cdp.gui_click_element('div[data-testid="user-tools-container"]')
845+
sb.cdp.mouse_click('div[data-testid="user-tools-container"]')
846846
sb.sleep(1.5)
847847
search = "Nike Air Force 1"
848848
sb.cdp.press_keys('input[type="search"]', search)

requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ trio-websocket==0.12.1
4343
wsproto==1.2.0
4444
websocket-client==1.8.0
4545
selenium==4.27.1;python_version<"3.9"
46-
selenium==4.28.1;python_version>="3.9"
46+
selenium==4.29.0;python_version>="3.9"
4747
cssselect==1.2.0
4848
sortedcontainers==2.4.0
4949
execnet==2.1.1

seleniumbase/__version__.py

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

seleniumbase/core/browser_launcher.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,8 @@ def uc_open_with_cdp_mode(driver, url=None):
723723
cdp.wait_for_text = CDPM.wait_for_text
724724
cdp.wait_for_text_not_visible = CDPM.wait_for_text_not_visible
725725
cdp.wait_for_element_visible = CDPM.wait_for_element_visible
726+
cdp.wait_for_element_not_visible = CDPM.wait_for_element_not_visible
727+
cdp.wait_for_element_absent = CDPM.wait_for_element_absent
726728
cdp.assert_element = CDPM.assert_element
727729
cdp.assert_element_visible = CDPM.assert_element_visible
728730
cdp.assert_element_present = CDPM.assert_element_present
@@ -1628,9 +1630,19 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
16281630
):
16291631
driver.uc_open_with_disconnect(driver.current_url, 3.8)
16301632
with suppress(Exception):
1633+
if "--debug" in sys.argv:
1634+
if sb_config._saved_cf_tab_count == 1:
1635+
print(' <DEBUG> pyautogui.press("\\t")')
1636+
else:
1637+
print(
1638+
' <DEBUG> pyautogui.press("\\t") * %s'
1639+
% sb_config._saved_cf_tab_count
1640+
)
16311641
for i in range(sb_config._saved_cf_tab_count):
16321642
pyautogui.press("\t")
16331643
time.sleep(0.027)
1644+
if "--debug" in sys.argv:
1645+
print(' <DEBUG> pyautogui.press(" ")')
16341646
pyautogui.press(" ")
16351647
else:
16361648
driver.disconnect()
@@ -2310,7 +2322,14 @@ def _set_chrome_options(
23102322
and not enable_3d_apis
23112323
):
23122324
chrome_options.add_argument("--disable-gpu")
2313-
if not IS_LINUX and is_using_uc(undetectable, browser_name):
2325+
if (
2326+
(not IS_LINUX and is_using_uc(undetectable, browser_name))
2327+
or (
2328+
IS_MAC
2329+
and binary_location
2330+
and "chrome-headless-shell" in binary_location
2331+
)
2332+
):
23142333
chrome_options.add_argument("--disable-dev-shm-usage")
23152334
chrome_options.add_argument("--disable-application-cache")
23162335
if IS_LINUX:

seleniumbase/core/sb_cdp.py

+55-45
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ def __press_keys(self, element, text):
497497
element.send_keys("\r\n")
498498
time.sleep(0.044)
499499
self.__slow_mode_pause_if_set()
500-
return self.loop.run_until_complete(self.page.wait())
500+
return self.loop.run_until_complete(self.page.sleep(0.025))
501501

502502
def __query_selector(self, element, selector):
503503
selector = self.__convert_to_css_if_xpath(selector)
@@ -864,7 +864,7 @@ def send_keys(self, selector, text, timeout=None):
864864
text = text[:-1] + "\r\n"
865865
element.send_keys(text)
866866
self.__slow_mode_pause_if_set()
867-
self.loop.run_until_complete(self.page.wait())
867+
self.loop.run_until_complete(self.page.sleep(0.025))
868868

869869
def press_keys(self, selector, text, timeout=None):
870870
"""Similar to send_keys(), but presses keys at human speed."""
@@ -884,7 +884,7 @@ def press_keys(self, selector, text, timeout=None):
884884
element.send_keys("\r\n")
885885
time.sleep(0.044)
886886
self.__slow_mode_pause_if_set()
887-
self.loop.run_until_complete(self.page.wait())
887+
self.loop.run_until_complete(self.page.sleep(0.025))
888888

889889
def type(self, selector, text, timeout=None):
890890
"""Similar to send_keys(), but clears the text field first."""
@@ -899,7 +899,7 @@ def type(self, selector, text, timeout=None):
899899
text = text[:-1] + "\r\n"
900900
element.send_keys(text)
901901
self.__slow_mode_pause_if_set()
902-
self.loop.run_until_complete(self.page.wait())
902+
self.loop.run_until_complete(self.page.sleep(0.025))
903903

904904
def set_value(self, selector, text, timeout=None):
905905
"""Similar to send_keys(), but clears the text field first."""
@@ -937,7 +937,7 @@ def set_value(self, selector, text, timeout=None):
937937
self.__add_light_pause()
938938
self.send_keys(selector, "\n")
939939
self.__slow_mode_pause_if_set()
940-
self.loop.run_until_complete(self.page.wait())
940+
self.loop.run_until_complete(self.page.sleep(0.025))
941941

942942
def evaluate(self, expression):
943943
"""Run a JavaScript expression and return the result."""
@@ -1377,7 +1377,7 @@ def gui_press_key(self, key):
13771377
pyautogui.press(key)
13781378
time.sleep(0.044)
13791379
self.__slow_mode_pause_if_set()
1380-
self.loop.run_until_complete(self.page.wait())
1380+
self.loop.run_until_complete(self.page.sleep(0.025))
13811381

13821382
def gui_press_keys(self, keys):
13831383
self.__install_pyautogui_if_missing()
@@ -1392,7 +1392,7 @@ def gui_press_keys(self, keys):
13921392
pyautogui.press(key)
13931393
time.sleep(0.044)
13941394
self.__slow_mode_pause_if_set()
1395-
self.loop.run_until_complete(self.page.wait())
1395+
self.loop.run_until_complete(self.page.sleep(0.025))
13961396

13971397
def gui_write(self, text):
13981398
self.__install_pyautogui_if_missing()
@@ -1405,7 +1405,7 @@ def gui_write(self, text):
14051405
self.__make_sure_pyautogui_lock_is_writable()
14061406
pyautogui.write(text)
14071407
self.__slow_mode_pause_if_set()
1408-
self.loop.run_until_complete(self.page.wait())
1408+
self.loop.run_until_complete(self.page.sleep(0.025))
14091409

14101410
def __gui_click_x_y(self, x, y, timeframe=0.25, uc_lock=False):
14111411
self.__install_pyautogui_if_missing()
@@ -1820,44 +1820,17 @@ def wait_for_element_visible(self, selector, timeout=None):
18201820
time.sleep(0.1)
18211821
raise Exception("Element {%s} was not visible!" % selector)
18221822

1823-
def assert_element(self, selector, timeout=None):
1824-
"""Same as assert_element_visible()"""
1825-
self.assert_element_visible(selector, timeout=timeout)
1826-
return True
1827-
1828-
def assert_element_visible(self, selector, timeout=None):
1829-
"""Same as assert_element()"""
1830-
if not timeout:
1831-
timeout = settings.SMALL_TIMEOUT
1832-
try:
1833-
self.select(selector, timeout=timeout)
1834-
except Exception:
1835-
raise Exception("Element {%s} was not found!" % selector)
1836-
for i in range(30):
1837-
if self.is_element_visible(selector):
1838-
return True
1839-
time.sleep(0.1)
1840-
raise Exception("Element {%s} was not visible!" % selector)
1841-
1842-
def assert_element_present(self, selector, timeout=None):
1843-
"""Assert element is present in the DOM. (Visibility NOT required)"""
1844-
if not timeout:
1845-
timeout = settings.SMALL_TIMEOUT
1846-
try:
1847-
self.select(selector, timeout=timeout)
1848-
except Exception:
1849-
raise Exception("Element {%s} was not found!" % selector)
1850-
return True
1851-
1852-
def assert_element_absent(self, selector, timeout=None):
1853-
"""Assert element is not present in the DOM."""
1823+
def wait_for_element_not_visible(self, selector, timeout=None):
1824+
"""Wait for element to not be visible on page. (May still be in DOM)"""
18541825
if not timeout:
18551826
timeout = settings.SMALL_TIMEOUT
18561827
start_ms = time.time() * 1000.0
18571828
stop_ms = start_ms + (timeout * 1000.0)
18581829
for i in range(int(timeout * 10)):
18591830
if not self.is_element_present(selector):
18601831
return True
1832+
elif not self.is_element_visible(selector):
1833+
return True
18611834
now_ms = time.time() * 1000.0
18621835
if now_ms >= stop_ms:
18631836
break
@@ -1866,21 +1839,19 @@ def assert_element_absent(self, selector, timeout=None):
18661839
if timeout == 1:
18671840
plural = ""
18681841
raise Exception(
1869-
"Element {%s} was still present after %s second%s!"
1842+
"Element {%s} was still visible after %s second%s!"
18701843
% (selector, timeout, plural)
18711844
)
18721845

1873-
def assert_element_not_visible(self, selector, timeout=None):
1874-
"""Assert element is not visible on page. (May still be in DOM)"""
1846+
def wait_for_element_absent(self, selector, timeout=None):
1847+
"""Wait for element to not be present in the DOM."""
18751848
if not timeout:
18761849
timeout = settings.SMALL_TIMEOUT
18771850
start_ms = time.time() * 1000.0
18781851
stop_ms = start_ms + (timeout * 1000.0)
18791852
for i in range(int(timeout * 10)):
18801853
if not self.is_element_present(selector):
18811854
return True
1882-
elif not self.is_element_visible(selector):
1883-
return True
18841855
now_ms = time.time() * 1000.0
18851856
if now_ms >= stop_ms:
18861857
break
@@ -1889,10 +1860,49 @@ def assert_element_not_visible(self, selector, timeout=None):
18891860
if timeout == 1:
18901861
plural = ""
18911862
raise Exception(
1892-
"Element {%s} was still visible after %s second%s!"
1863+
"Element {%s} was still present after %s second%s!"
18931864
% (selector, timeout, plural)
18941865
)
18951866

1867+
def assert_element(self, selector, timeout=None):
1868+
"""Same as assert_element_visible()"""
1869+
self.assert_element_visible(selector, timeout=timeout)
1870+
return True
1871+
1872+
def assert_element_visible(self, selector, timeout=None):
1873+
"""Same as assert_element()"""
1874+
if not timeout:
1875+
timeout = settings.SMALL_TIMEOUT
1876+
try:
1877+
self.select(selector, timeout=timeout)
1878+
except Exception:
1879+
raise Exception("Element {%s} was not found!" % selector)
1880+
for i in range(30):
1881+
if self.is_element_visible(selector):
1882+
return True
1883+
time.sleep(0.1)
1884+
raise Exception("Element {%s} was not visible!" % selector)
1885+
1886+
def assert_element_present(self, selector, timeout=None):
1887+
"""Assert element is present in the DOM. (Visibility NOT required)"""
1888+
if not timeout:
1889+
timeout = settings.SMALL_TIMEOUT
1890+
try:
1891+
self.select(selector, timeout=timeout)
1892+
except Exception:
1893+
raise Exception("Element {%s} was not found!" % selector)
1894+
return True
1895+
1896+
def assert_element_absent(self, selector, timeout=None):
1897+
"""Assert element is not present in the DOM."""
1898+
self.wait_for_element_absent(selector, timeout=timeout)
1899+
return True
1900+
1901+
def assert_element_not_visible(self, selector, timeout=None):
1902+
"""Assert element is not visible on page. (May still be in DOM)"""
1903+
self.wait_for_element_not_visible(selector, timeout=timeout)
1904+
return True
1905+
18961906
def assert_element_attribute(self, selector, attribute, value=None):
18971907
attributes = self.get_element_attributes(selector)
18981908
if attribute not in attributes:

0 commit comments

Comments
 (0)