Skip to content

Commit a9c55a4

Browse files
committed
Update CDP Mode
1 parent f94f4a7 commit a9c55a4

1 file changed

Lines changed: 66 additions & 38 deletions

File tree

seleniumbase/core/sb_cdp.py

Lines changed: 66 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -233,11 +233,30 @@ def find_element(self, selector, best_match=False, timeout=None):
233233
try:
234234
if early_failure:
235235
raise Exception("Failed!")
236-
element = self.loop.run_until_complete(
237-
self.page.find(
238-
selector, best_match=best_match, timeout=timeout
236+
if (
237+
"contains(" not in selector
238+
and not page_utils.is_xpath_selector(selector)
239+
and not re.findall(r"\.\s", selector)
240+
and not re.findall(r"\.$", selector)
241+
and not re.findall(r"#\s", selector)
242+
and not re.findall(r"#$", selector)
243+
and (
244+
selector in ["html", "body"]
245+
or "[" in selector
246+
or re.findall(r"\.\S", selector)
247+
or re.findall(r"#\S", selector)
248+
or " > " in selector
249+
)
250+
):
251+
element = self.loop.run_until_complete(
252+
self.page.select(selector, timeout=timeout)
253+
)
254+
else:
255+
element = self.loop.run_until_complete(
256+
self.page.find(
257+
selector, best_match=best_match, timeout=timeout
258+
)
239259
)
240-
)
241260
except Exception:
242261
failure = True
243262
plural = "s"
@@ -375,8 +394,17 @@ def select_all(self, selector, timeout=None):
375394
timeout = settings.SMALL_TIMEOUT
376395
self.__add_light_pause()
377396
selector = self.__convert_to_css_if_xpath(selector)
397+
if not self.is_element_present(selector):
398+
self.sleep(1)
399+
timeout = timeout - 1
400+
if timeout < 1:
401+
timeout = 1
402+
try:
403+
self.select(selector, timeout=timeout)
404+
except Exception:
405+
return []
378406
elements = self.loop.run_until_complete(
379-
self.page.select_all(selector, timeout=timeout)
407+
self.page.select_all(selector, timeout=0.1)
380408
)
381409
updated_elements = []
382410
for element in elements:
@@ -453,7 +481,7 @@ def __click(self, element):
453481
result = (
454482
self.loop.run_until_complete(element.click_async())
455483
)
456-
self.loop.run_until_complete(self.page.wait())
484+
self.loop.run_until_complete(self.page.wait(0.2))
457485
return result
458486

459487
def __flash(self, element, *args, **kwargs):
@@ -506,7 +534,7 @@ def __gui_click(self, element, timeframe=None):
506534
if timeframe > 3:
507535
timeframe = 3
508536
self.gui_click_x_y(x, y, timeframe=timeframe)
509-
return self.loop.run_until_complete(self.page.wait())
537+
return self.loop.run_until_complete(self.page.wait(0.2))
510538

511539
def __highlight_overlay(self, element):
512540
return (
@@ -517,7 +545,7 @@ def __mouse_click(self, element):
517545
result = (
518546
self.loop.run_until_complete(element.mouse_click_async())
519547
)
520-
self.loop.run_until_complete(self.page.wait())
548+
self.loop.run_until_complete(self.page.wait(0.2))
521549
return result
522550

523551
def __mouse_click_with_offset_async(self, element, *args, **kwargs):
@@ -526,7 +554,7 @@ def __mouse_click_with_offset_async(self, element, *args, **kwargs):
526554
element.mouse_click_with_offset_async(*args, **kwargs)
527555
)
528556
)
529-
self.loop.run_until_complete(self.page.wait())
557+
self.loop.run_until_complete(self.page.wait(0.2))
530558
return result
531559

532560
def __mouse_drag(self, element, destination):
@@ -787,14 +815,14 @@ def click(self, selector, timeout=None):
787815
else:
788816
element.click() # Standard CDP click
789817
self.__slow_mode_pause_if_set()
790-
self.loop.run_until_complete(self.page.wait())
818+
self.loop.run_until_complete(self.page.wait(0.2))
791819

792820
def click_active_element(self):
793821
self.loop.run_until_complete(
794822
self.page.evaluate("document.activeElement.click()")
795823
)
796824
self.__slow_mode_pause_if_set()
797-
self.loop.run_until_complete(self.page.wait())
825+
self.loop.run_until_complete(self.page.wait(0.2))
798826

799827
def click_if_visible(self, selector, timeout=0):
800828
if self.is_element_visible(selector):
@@ -836,7 +864,7 @@ def click_visible_elements(self, selector, limit=0):
836864
click_count += 1
837865
time.sleep(0.044)
838866
self.__slow_mode_pause_if_set()
839-
self.loop.run_until_complete(self.page.wait())
867+
self.loop.run_until_complete(self.page.wait(0.2))
840868
except Exception:
841869
break
842870

@@ -849,7 +877,7 @@ def mouse_click(self, selector, timeout=None):
849877
element.scroll_into_view()
850878
element.mouse_click()
851879
self.__slow_mode_pause_if_set()
852-
self.loop.run_until_complete(self.page.wait())
880+
self.loop.run_until_complete(self.page.wait(0.2))
853881

854882
def nested_click(self, parent_selector, selector):
855883
"""
@@ -859,7 +887,7 @@ def nested_click(self, parent_selector, selector):
859887
element = self.find_element(parent_selector)
860888
element.query_selector(selector).mouse_click()
861889
self.__slow_mode_pause_if_set()
862-
self.loop.run_until_complete(self.page.wait())
890+
self.loop.run_until_complete(self.page.wait(0.2))
863891

864892
def get_nested_element(self, parent_selector, selector):
865893
"""(Can be used to find an element inside an iframe)"""
@@ -1924,7 +1952,7 @@ def gui_click_element(self, selector, timeframe=0.25):
19241952
self.__add_light_pause()
19251953
self.gui_click_x_y(x, y, timeframe=timeframe)
19261954
self.__slow_mode_pause_if_set()
1927-
self.loop.run_until_complete(self.page.wait())
1955+
self.loop.run_until_complete(self.page.wait(0.2))
19281956

19291957
def gui_click_with_offset(
19301958
self, selector, x, y, timeframe=0.25, center=False
@@ -1957,7 +1985,7 @@ def click_with_offset(self, selector, x, y, center=False):
19571985
)
19581986
element.click_with_offset(x=x, y=y, center=center)
19591987
self.__slow_mode_pause_if_set()
1960-
self.loop.run_until_complete(self.page.wait())
1988+
self.loop.run_until_complete(self.page.wait(0.2))
19611989

19621990
def _on_a_cf_turnstile_page(self, source=None):
19631991
if not source or len(source) < 400:
@@ -1978,7 +2006,7 @@ def _on_a_cf_turnstile_page(self, source=None):
19782006
return False
19792007

19802008
def _on_an_incapsula_hcaptcha_page(self, *args, **kwargs):
1981-
self.loop.run_until_complete(self.page.wait())
2009+
self.loop.run_until_complete(self.page.wait(0.1))
19822010
if (
19832011
self.is_element_visible('iframe[src*="_Incapsula_Resource?"]')
19842012
or self.is_element_visible("iframe[data-hcaptcha-widget-id]")
@@ -1987,7 +2015,7 @@ def _on_an_incapsula_hcaptcha_page(self, *args, **kwargs):
19872015
return False
19882016

19892017
def _on_a_datadome_slider_page(self, *args, **kwargs):
1990-
self.loop.run_until_complete(self.page.wait())
2018+
self.loop.run_until_complete(self.page.wait(0.1))
19912019
if (
19922020
self.is_element_visible(
19932021
'body > iframe[src*="/geo.captcha-delivery.com/captcha/"]'
@@ -1998,7 +2026,7 @@ def _on_a_datadome_slider_page(self, *args, **kwargs):
19982026

19992027
def _on_a_g_recaptcha_page(self, *args, **kwargs):
20002028
time.sleep(0.4) # reCAPTCHA may need a moment to appear
2001-
self.loop.run_until_complete(self.page.wait())
2029+
self.loop.run_until_complete(self.page.wait(0.1))
20022030
source = self.get_page_source()
20032031
if (
20042032
(
@@ -2028,7 +2056,7 @@ def __gui_click_recaptcha(self, use_cdp=False):
20282056
else:
20292057
return False
20302058
time.sleep(0.25)
2031-
self.loop.run_until_complete(self.page.wait())
2059+
self.loop.run_until_complete(self.page.wait(0.1))
20322060
time.sleep(0.25)
20332061
with suppress(Exception):
20342062
element_rect = self.get_element_rect(selector, timeout=0.1)
@@ -2077,15 +2105,15 @@ def __gui_slide_datadome_captcha(self):
20772105
tab = self.get_active_tab()
20782106
self.open_new_tab(url=src)
20792107
time.sleep(0.41)
2080-
self.loop.run_until_complete(self.page.wait())
2108+
self.loop.run_until_complete(self.page.wait(0.1))
20812109
time.sleep(0.25)
20822110
x1, y1 = self.get_gui_element_center("div.slider")
20832111
x2, y2 = self.get_gui_element_center("div.sliderTarget")
20842112
self.close_active_tab()
20852113
self.switch_to_tab(tab)
20862114
self.gui_drag_drop_points(x1, y1, x2, y2, timeframe=0.55)
20872115
time.sleep(0.25)
2088-
self.loop.run_until_complete(self.page.wait())
2116+
self.loop.run_until_complete(self.page.wait(0.2))
20892117
time.sleep(0.15)
20902118
return True
20912119

@@ -2103,7 +2131,7 @@ def __cdp_click_incapsula_hcaptcha(self):
21032131
else:
21042132
return False
21052133
time.sleep(0.05)
2106-
self.loop.run_until_complete(self.page.wait())
2134+
self.loop.run_until_complete(self.page.wait(0.1))
21072135
time.sleep(0.05)
21082136
x_offset = 30
21092137
y_offset = 36
@@ -2130,7 +2158,7 @@ def __cdp_click_incapsula_hcaptcha(self):
21302158
# Wait a moment for the click to succeed
21312159
time.sleep(0.75)
21322160
self.__slow_mode_pause_if_set()
2133-
self.loop.run_until_complete(self.page.wait())
2161+
self.loop.run_until_complete(self.page.wait(0.1))
21342162
if "--debug" in sys.argv:
21352163
print(" <DEBUG> hCaptcha was clicked!")
21362164
return True
@@ -2152,7 +2180,7 @@ def gui_click_captcha(self):
21522180
def __click_captcha(self, use_cdp=False):
21532181
"""Uses PyAutoGUI unless use_cdp == True"""
21542182
self.sleep(0.075)
2155-
self.loop.run_until_complete(self.page.wait())
2183+
self.loop.run_until_complete(self.page.wait(0.1))
21562184
self.sleep(0.025)
21572185
source = self.get_page_source()
21582186
if self._on_a_cf_turnstile_page(source):
@@ -2244,7 +2272,7 @@ def __click_captcha(self, use_cdp=False):
22442272
)
22452273
with suppress(Exception):
22462274
self.loop.run_until_complete(self.page.evaluate(script))
2247-
self.loop.run_until_complete(self.page.wait())
2275+
self.loop.run_until_complete(self.page.wait(0.1))
22482276
elif (
22492277
self.is_element_present("form")
22502278
and (
@@ -2264,7 +2292,7 @@ def __click_captcha(self, use_cdp=False):
22642292
)
22652293
with suppress(Exception):
22662294
self.loop.run_until_complete(self.page.evaluate(script))
2267-
self.loop.run_until_complete(self.page.wait())
2295+
self.loop.run_until_complete(self.page.wait(0.1))
22682296
elif (
22692297
self.is_element_present(
22702298
'form [id*="turnstile"] div:not([class])'
@@ -2287,7 +2315,7 @@ def __click_captcha(self, use_cdp=False):
22872315
)
22882316
with suppress(Exception):
22892317
self.loop.run_until_complete(self.page.evaluate(script))
2290-
self.loop.run_until_complete(self.page.wait())
2318+
self.loop.run_until_complete(self.page.wait(0.1))
22912319
elif (
22922320
self.is_element_present(
22932321
'[style*="text-align: center;"] div:not([class])'
@@ -2304,7 +2332,7 @@ def __click_captcha(self, use_cdp=False):
23042332
)
23052333
with suppress(Exception):
23062334
self.loop.run_until_complete(self.page.evaluate(script))
2307-
self.loop.run_until_complete(self.page.wait())
2335+
self.loop.run_until_complete(self.page.wait(0.1))
23082336
with suppress(Exception):
23092337
time.sleep(0.05)
23102338
element_rect = self.get_gui_element_rect(selector, timeout=1)
@@ -2407,7 +2435,7 @@ def gui_drag_drop_points(self, x1, y1, x2, y2, timeframe=0.35):
24072435
x1, y1, x2, y2, timeframe=timeframe, uc_lock=False
24082436
)
24092437
self.__slow_mode_pause_if_set()
2410-
self.loop.run_until_complete(self.page.wait())
2438+
self.loop.run_until_complete(self.page.wait(0.2))
24112439

24122440
def gui_drag_and_drop(self, drag_selector, drop_selector, timeframe=0.35):
24132441
"""Use PyAutoGUI to drag-and-drop from one selector to another.
@@ -2514,7 +2542,7 @@ def gui_hover_element(self, selector, timeframe=0.25):
25142542
self.bring_active_window_to_front()
25152543
self.__gui_hover_x_y(x, y, timeframe=timeframe, uc_lock=False)
25162544
self.__slow_mode_pause_if_set()
2517-
self.loop.run_until_complete(self.page.wait())
2545+
self.loop.run_until_complete(self.page.wait(0.1))
25182546

25192547
def hover_element(self, selector, timeframe=0.25):
25202548
element = self.select(selector)
@@ -3077,33 +3105,33 @@ def assert_not_in(self, first, second):
30773105

30783106
def scroll_into_view(self, selector):
30793107
self.find_element(selector).scroll_into_view()
3080-
self.loop.run_until_complete(self.page.wait())
3108+
self.loop.run_until_complete(self.page.wait(0.1))
30813109

30823110
def scroll_to_y(self, y):
30833111
y = int(y)
30843112
js_code = "window.scrollTo(0, %s);" % y
30853113
with suppress(Exception):
30863114
self.loop.run_until_complete(self.page.evaluate(js_code))
3087-
self.loop.run_until_complete(self.page.wait())
3115+
self.loop.run_until_complete(self.page.wait(0.1))
30883116

30893117
def scroll_by_y(self, y):
30903118
y = int(y)
30913119
js_code = "window.scrollBy(0, %s);" % y
30923120
with suppress(Exception):
30933121
self.loop.run_until_complete(self.page.evaluate(js_code))
3094-
self.loop.run_until_complete(self.page.wait())
3122+
self.loop.run_until_complete(self.page.wait(0.1))
30953123

30963124
def scroll_to_top(self):
30973125
js_code = "window.scrollTo(0, 0);"
30983126
with suppress(Exception):
30993127
self.loop.run_until_complete(self.page.evaluate(js_code))
3100-
self.loop.run_until_complete(self.page.wait())
3128+
self.loop.run_until_complete(self.page.wait(0.1))
31013129

31023130
def scroll_to_bottom(self):
31033131
js_code = "window.scrollTo(0, 10000);"
31043132
with suppress(Exception):
31053133
self.loop.run_until_complete(self.page.evaluate(js_code))
3106-
self.loop.run_until_complete(self.page.wait())
3134+
self.loop.run_until_complete(self.page.wait(0.1))
31073135

31083136
def scroll_up(self, amount=25):
31093137
"""Scrolls up as a percentage of the page."""
@@ -3112,7 +3140,7 @@ def scroll_up(self, amount=25):
31123140
except Exception:
31133141
amount = self.get_window_size()["height"] * amount / 100
31143142
self.execute_script("window.scrollBy(0, -%s);" % amount)
3115-
self.loop.run_until_complete(self.page.wait())
3143+
self.loop.run_until_complete(self.page.wait(0.1))
31163144

31173145
def scroll_down(self, amount=25):
31183146
"""Scrolls down as a percentage of the page."""
@@ -3121,7 +3149,7 @@ def scroll_down(self, amount=25):
31213149
except Exception:
31223150
amount = self.get_window_size()["height"] * amount / 100
31233151
self.execute_script("window.scrollBy(0, %s);" % amount)
3124-
self.loop.run_until_complete(self.page.wait())
3152+
self.loop.run_until_complete(self.page.wait(0.1))
31253153

31263154
def save_page_source(self, name, folder=None):
31273155
from seleniumbase.core import log_helper

0 commit comments

Comments
 (0)