@@ -76,13 +76,21 @@ def __add_sync_methods(self, element):
7676
7777 def get (self , url ):
7878 url = shared_utils .fix_url_as_needed (url )
79- self .page = self .loop .run_until_complete (self .driver .cdp_base .get (url ))
79+ driver = self .driver
80+ if hasattr (driver , "cdp_base" ):
81+ driver = driver .cdp_base
82+ self .page = self .loop .run_until_complete (driver .get (url ))
8083 url_protocol = url .split (":" )[0 ]
8184 safe_url = True
8285 if url_protocol not in ["about" , "data" , "chrome" ]:
8386 safe_url = False
8487 if not safe_url :
8588 time .sleep (constants .UC .CDP_MODE_OPEN_WAIT )
89+ self .__slow_mode_pause_if_set ()
90+ self .loop .run_until_complete (self .page .wait ())
91+
92+ def open (self , url ):
93+ self .get (url )
8694
8795 def reload (self , ignore_cache = True , script_to_evaluate_on_load = None ):
8896 self .loop .run_until_complete (
@@ -111,18 +119,28 @@ def find_element(
111119 with the closest text-length to the text being searched for."""
112120 self .__add_light_pause ()
113121 selector = self .__convert_to_css_if_xpath (selector )
122+ early_failure = False
114123 if (":contains(" in selector ):
115124 tag_name = selector .split (":contains(" )[0 ].split (" " )[- 1 ]
116125 text = selector .split (":contains(" )[1 ].split (")" )[0 ][1 :- 1 ]
117126 with suppress (Exception ):
118127 self .loop .run_until_complete (
119- self .page .select (tag_name , timeout = 3 )
128+ self .page .select (tag_name , timeout = timeout )
120129 )
121- self .loop .run_until_complete (self .page .find (text , timeout = 3 ))
122- element = self .find_elements_by_text (text , tag_name = tag_name )[0 ]
123- return self .__add_sync_methods (element )
130+ self .loop .run_until_complete (
131+ self .page .find (text , timeout = timeout )
132+ )
133+ elements = []
134+ with suppress (Exception ):
135+ elements = self .find_elements_by_text (text , tag_name = tag_name )
136+ if elements :
137+ return self .__add_sync_methods (elements [0 ])
138+ else :
139+ early_failure = True
124140 failure = False
125141 try :
142+ if early_failure :
143+ raise Exception ("Failed!" )
126144 element = self .loop .run_until_complete (
127145 self .page .find (
128146 selector , best_match = best_match , timeout = timeout
@@ -230,9 +248,11 @@ def __clear_input(self, element):
230248 )
231249
232250 def __click (self , element ):
233- return (
251+ result = (
234252 self .loop .run_until_complete (element .click_async ())
235253 )
254+ self .loop .run_until_complete (self .page .wait ())
255+ return result
236256
237257 def __flash (self , element ):
238258 return (
@@ -250,9 +270,11 @@ def __highlight_overlay(self, element):
250270 )
251271
252272 def __mouse_click (self , element ):
253- return (
273+ result = (
254274 self .loop .run_until_complete (element .mouse_click_async ())
255275 )
276+ self .loop .run_until_complete (self .page .wait ())
277+ return result
256278
257279 def __mouse_drag (self , element , destination ):
258280 return (
@@ -353,33 +375,51 @@ def __get_js_attributes(self, element):
353375
354376 def tile_windows (self , windows = None , max_columns = 0 ):
355377 """Tile windows and return the grid of tiled windows."""
378+ driver = self .driver
379+ if hasattr (driver , "cdp_base" ):
380+ driver = driver .cdp_base
356381 return self .loop .run_until_complete (
357- self . driver . cdp_base .tile_windows (windows , max_columns )
382+ driver .tile_windows (windows , max_columns )
358383 )
359384
360385 def get_all_cookies (self , * args , ** kwargs ):
386+ driver = self .driver
387+ if hasattr (driver , "cdp_base" ):
388+ driver = driver .cdp_base
361389 return self .loop .run_until_complete (
362- self . driver . cdp_base .cookies .get_all (* args , ** kwargs )
390+ driver .cookies .get_all (* args , ** kwargs )
363391 )
364392
365393 def set_all_cookies (self , * args , ** kwargs ):
394+ driver = self .driver
395+ if hasattr (driver , "cdp_base" ):
396+ driver = driver .cdp_base
366397 return self .loop .run_until_complete (
367- self . driver . cdp_base .cookies .set_all (* args , ** kwargs )
398+ driver .cookies .set_all (* args , ** kwargs )
368399 )
369400
370401 def save_cookies (self , * args , ** kwargs ):
402+ driver = self .driver
403+ if hasattr (driver , "cdp_base" ):
404+ driver = driver .cdp_base
371405 return self .loop .run_until_complete (
372- self . driver . cdp_base .cookies .save (* args , ** kwargs )
406+ driver .cookies .save (* args , ** kwargs )
373407 )
374408
375409 def load_cookies (self , * args , ** kwargs ):
410+ driver = self .driver
411+ if hasattr (driver , "cdp_base" ):
412+ driver = driver .cdp_base
376413 return self .loop .run_until_complete (
377- self . driver . cdp_base .cookies .load (* args , ** kwargs )
414+ driver .cookies .load (* args , ** kwargs )
378415 )
379416
380417 def clear_cookies (self , * args , ** kwargs ):
418+ driver = self .driver
419+ if hasattr (driver , "cdp_base" ):
420+ driver = driver .cdp_base
381421 return self .loop .run_until_complete (
382- self . driver . cdp_base .cookies .clear (* args , ** kwargs )
422+ driver .cookies .clear (* args , ** kwargs )
383423 )
384424
385425 def sleep (self , seconds ):
@@ -408,17 +448,20 @@ def click(self, selector, timeout=settings.SMALL_TIMEOUT):
408448 self .__add_light_pause ()
409449 element .click ()
410450 self .__slow_mode_pause_if_set ()
451+ self .loop .run_until_complete (self .page .wait ())
411452
412453 def click_active_element (self ):
413454 self .loop .run_until_complete (
414455 self .page .evaluate ("document.activeElement.click()" )
415456 )
416457 self .__slow_mode_pause_if_set ()
458+ self .loop .run_until_complete (self .page .wait ())
417459
418460 def click_if_visible (self , selector ):
419461 if self .is_element_visible (selector ):
420462 self .find_element (selector ).click ()
421463 self .__slow_mode_pause_if_set ()
464+ self .loop .run_until_complete (self .page .wait ())
422465
423466 def mouse_click (self , selector , timeout = settings .SMALL_TIMEOUT ):
424467 """(Attempt simulating a mouse click)"""
@@ -427,6 +470,7 @@ def mouse_click(self, selector, timeout=settings.SMALL_TIMEOUT):
427470 self .__add_light_pause ()
428471 element .mouse_click ()
429472 self .__slow_mode_pause_if_set ()
473+ self .loop .run_until_complete (self .page .wait ())
430474
431475 def nested_click (self , parent_selector , selector ):
432476 """
@@ -436,6 +480,7 @@ def nested_click(self, parent_selector, selector):
436480 element = self .find_element (parent_selector )
437481 element .query_selector (selector ).mouse_click ()
438482 self .__slow_mode_pause_if_set ()
483+ self .loop .run_until_complete (self .page .wait ())
439484
440485 def get_nested_element (self , parent_selector , selector ):
441486 """(Can be used to find an element inside an iframe)"""
@@ -483,6 +528,7 @@ def send_keys(self, selector, text, timeout=settings.SMALL_TIMEOUT):
483528 text = text [:- 1 ] + "\r \n "
484529 element .send_keys (text )
485530 self .__slow_mode_pause_if_set ()
531+ self .loop .run_until_complete (self .page .wait ())
486532
487533 def press_keys (self , selector , text , timeout = settings .SMALL_TIMEOUT ):
488534 """Similar to send_keys(), but presses keys at human speed."""
@@ -499,6 +545,7 @@ def press_keys(self, selector, text, timeout=settings.SMALL_TIMEOUT):
499545 element .send_keys ("\r \n " )
500546 time .sleep (0.0375 )
501547 self .__slow_mode_pause_if_set ()
548+ self .loop .run_until_complete (self .page .wait ())
502549
503550 def type (self , selector , text , timeout = settings .SMALL_TIMEOUT ):
504551 """Similar to send_keys(), but clears the text field first."""
@@ -510,6 +557,7 @@ def type(self, selector, text, timeout=settings.SMALL_TIMEOUT):
510557 text = text [:- 1 ] + "\r \n "
511558 element .send_keys (text )
512559 self .__slow_mode_pause_if_set ()
560+ self .loop .run_until_complete (self .page .wait ())
513561
514562 def evaluate (self , expression ):
515563 """Run a JavaScript expression and return the result."""
@@ -760,6 +808,10 @@ def get_element_html(self, selector):
760808 )
761809 )
762810
811+ def set_locale (self , locale ):
812+ """(Settings will take effect on the next page load)"""
813+ self .loop .run_until_complete (self .page .set_locale (locale ))
814+
763815 def set_attributes (self , selector , attribute , value ):
764816 """This method uses JavaScript to set/update a common attribute.
765817 All matching selectors from querySelectorAll() are used.
0 commit comments