Skip to content

Commit 24317c1

Browse files
committed
Update CDP Mode
1 parent 131bd70 commit 24317c1

File tree

4 files changed

+88
-54
lines changed

4 files changed

+88
-54
lines changed

Diff for: examples/cdp_mode/ReadMe.md

+2
Original file line numberDiff line numberDiff line change
@@ -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)

Diff for: 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:

Diff for: 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:

Diff for: seleniumbase/fixtures/base_case.py

+11-8
Original file line numberDiff line numberDiff line change
@@ -9124,7 +9124,7 @@ def wait_for_element_not_present(
91249124
original_selector = selector
91259125
selector, by = self.__recalculate_selector(selector, by)
91269126
if self.__is_cdp_swap_needed():
9127-
self.cdp.assert_element_absent(selector)
9127+
self.cdp.wait_for_element_absent(selector, timeout=timeout)
91289128
return True
91299129
return page_actions.wait_for_element_absent(
91309130
self.driver,
@@ -9585,7 +9585,7 @@ def assert_element_present(
95859585
self.assert_elements_present(selector, by=by, timeout=timeout)
95869586
return True
95879587
if self.__is_cdp_swap_needed():
9588-
self.cdp.assert_element_present(selector)
9588+
self.cdp.assert_element_present(selector, timeout=timeout)
95899589
return True
95909590
if self.__is_shadow_selector(selector):
95919591
self.__assert_shadow_element_present(selector)
@@ -9662,7 +9662,7 @@ def assert_element(self, selector, by="css selector", timeout=None):
96629662
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
96639663
timeout = self.__get_new_timeout(timeout)
96649664
if self.__is_cdp_swap_needed():
9665-
self.cdp.assert_element(selector)
9665+
self.cdp.assert_element(selector, timeout=timeout)
96669666
return True
96679667
if isinstance(selector, list):
96689668
self.assert_elements(selector, by=by, timeout=timeout)
@@ -9955,7 +9955,7 @@ def assert_text(
99559955
messenger_post, selector, by
99569956
)
99579957
elif self.__is_cdp_swap_needed():
9958-
self.cdp.assert_text(text, selector)
9958+
self.cdp.assert_text(text, selector, timeout=timeout)
99599959
return True
99609960
elif not self.is_connected():
99619961
self.connect()
@@ -10005,7 +10005,7 @@ def assert_exact_text(
1000510005
original_selector = selector
1000610006
selector, by = self.__recalculate_selector(selector, by)
1000710007
if self.__is_cdp_swap_needed():
10008-
self.cdp.assert_exact_text(text, selector)
10008+
self.cdp.assert_exact_text(text, selector, timeout=timeout)
1000910009
return True
1001010010
if self.__is_shadow_selector(selector):
1001110011
self.__assert_exact_shadow_text_visible(text, selector, timeout)
@@ -10245,6 +10245,9 @@ def wait_for_element_absent(
1024510245
timeout = self.__get_new_timeout(timeout)
1024610246
original_selector = selector
1024710247
selector, by = self.__recalculate_selector(selector, by)
10248+
if self.__is_cdp_swap_needed():
10249+
self.cdp.wait_for_element_absent(selector, timeout=timeout)
10250+
return True
1024810251
return page_actions.wait_for_element_absent(
1024910252
self.driver,
1025010253
selector,
@@ -10267,7 +10270,7 @@ def assert_element_absent(self, selector, by="css selector", timeout=None):
1026710270
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
1026810271
timeout = self.__get_new_timeout(timeout)
1026910272
if self.__is_cdp_swap_needed():
10270-
self.cdp.assert_element_absent(selector)
10273+
self.cdp.assert_element_absent(selector, timeout=timeout)
1027110274
return True
1027210275
self.wait_for_element_absent(selector, by=by, timeout=timeout)
1027310276
return True
@@ -10288,7 +10291,7 @@ def wait_for_element_not_visible(
1028810291
original_selector = selector
1028910292
selector, by = self.__recalculate_selector(selector, by)
1029010293
if self.__is_cdp_swap_needed():
10291-
self.cdp.assert_element_not_visible(selector)
10294+
self.cdp.wait_for_element_not_visible(selector, timeout=timeout)
1029210295
return True
1029310296
return page_actions.wait_for_element_not_visible(
1029410297
self.driver,
@@ -10310,7 +10313,7 @@ def assert_element_not_visible(
1031010313
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
1031110314
timeout = self.__get_new_timeout(timeout)
1031210315
if self.__is_cdp_swap_needed():
10313-
self.cdp.assert_element_not_visible(selector)
10316+
self.cdp.assert_element_not_visible(selector, timeout=timeout)
1031410317
return True
1031510318
self.wait_for_element_not_visible(selector, by=by, timeout=timeout)
1031610319
if self.recorder_mode and self.__current_url_is_recordable():

0 commit comments

Comments
 (0)