@@ -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