@@ -76,13 +76,21 @@ def __add_sync_methods(self, element):
76
76
77
77
def get (self , url ):
78
78
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 ))
80
83
url_protocol = url .split (":" )[0 ]
81
84
safe_url = True
82
85
if url_protocol not in ["about" , "data" , "chrome" ]:
83
86
safe_url = False
84
87
if not safe_url :
85
88
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 )
86
94
87
95
def reload (self , ignore_cache = True , script_to_evaluate_on_load = None ):
88
96
self .loop .run_until_complete (
@@ -111,18 +119,28 @@ def find_element(
111
119
with the closest text-length to the text being searched for."""
112
120
self .__add_light_pause ()
113
121
selector = self .__convert_to_css_if_xpath (selector )
122
+ early_failure = False
114
123
if (":contains(" in selector ):
115
124
tag_name = selector .split (":contains(" )[0 ].split (" " )[- 1 ]
116
125
text = selector .split (":contains(" )[1 ].split (")" )[0 ][1 :- 1 ]
117
126
with suppress (Exception ):
118
127
self .loop .run_until_complete (
119
- self .page .select (tag_name , timeout = 3 )
128
+ self .page .select (tag_name , timeout = timeout )
120
129
)
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
124
140
failure = False
125
141
try :
142
+ if early_failure :
143
+ raise Exception ("Failed!" )
126
144
element = self .loop .run_until_complete (
127
145
self .page .find (
128
146
selector , best_match = best_match , timeout = timeout
@@ -230,9 +248,11 @@ def __clear_input(self, element):
230
248
)
231
249
232
250
def __click (self , element ):
233
- return (
251
+ result = (
234
252
self .loop .run_until_complete (element .click_async ())
235
253
)
254
+ self .loop .run_until_complete (self .page .wait ())
255
+ return result
236
256
237
257
def __flash (self , element ):
238
258
return (
@@ -250,9 +270,11 @@ def __highlight_overlay(self, element):
250
270
)
251
271
252
272
def __mouse_click (self , element ):
253
- return (
273
+ result = (
254
274
self .loop .run_until_complete (element .mouse_click_async ())
255
275
)
276
+ self .loop .run_until_complete (self .page .wait ())
277
+ return result
256
278
257
279
def __mouse_drag (self , element , destination ):
258
280
return (
@@ -353,33 +375,51 @@ def __get_js_attributes(self, element):
353
375
354
376
def tile_windows (self , windows = None , max_columns = 0 ):
355
377
"""Tile windows and return the grid of tiled windows."""
378
+ driver = self .driver
379
+ if hasattr (driver , "cdp_base" ):
380
+ driver = driver .cdp_base
356
381
return self .loop .run_until_complete (
357
- self . driver . cdp_base .tile_windows (windows , max_columns )
382
+ driver .tile_windows (windows , max_columns )
358
383
)
359
384
360
385
def get_all_cookies (self , * args , ** kwargs ):
386
+ driver = self .driver
387
+ if hasattr (driver , "cdp_base" ):
388
+ driver = driver .cdp_base
361
389
return self .loop .run_until_complete (
362
- self . driver . cdp_base .cookies .get_all (* args , ** kwargs )
390
+ driver .cookies .get_all (* args , ** kwargs )
363
391
)
364
392
365
393
def set_all_cookies (self , * args , ** kwargs ):
394
+ driver = self .driver
395
+ if hasattr (driver , "cdp_base" ):
396
+ driver = driver .cdp_base
366
397
return self .loop .run_until_complete (
367
- self . driver . cdp_base .cookies .set_all (* args , ** kwargs )
398
+ driver .cookies .set_all (* args , ** kwargs )
368
399
)
369
400
370
401
def save_cookies (self , * args , ** kwargs ):
402
+ driver = self .driver
403
+ if hasattr (driver , "cdp_base" ):
404
+ driver = driver .cdp_base
371
405
return self .loop .run_until_complete (
372
- self . driver . cdp_base .cookies .save (* args , ** kwargs )
406
+ driver .cookies .save (* args , ** kwargs )
373
407
)
374
408
375
409
def load_cookies (self , * args , ** kwargs ):
410
+ driver = self .driver
411
+ if hasattr (driver , "cdp_base" ):
412
+ driver = driver .cdp_base
376
413
return self .loop .run_until_complete (
377
- self . driver . cdp_base .cookies .load (* args , ** kwargs )
414
+ driver .cookies .load (* args , ** kwargs )
378
415
)
379
416
380
417
def clear_cookies (self , * args , ** kwargs ):
418
+ driver = self .driver
419
+ if hasattr (driver , "cdp_base" ):
420
+ driver = driver .cdp_base
381
421
return self .loop .run_until_complete (
382
- self . driver . cdp_base .cookies .clear (* args , ** kwargs )
422
+ driver .cookies .clear (* args , ** kwargs )
383
423
)
384
424
385
425
def sleep (self , seconds ):
@@ -408,17 +448,20 @@ def click(self, selector, timeout=settings.SMALL_TIMEOUT):
408
448
self .__add_light_pause ()
409
449
element .click ()
410
450
self .__slow_mode_pause_if_set ()
451
+ self .loop .run_until_complete (self .page .wait ())
411
452
412
453
def click_active_element (self ):
413
454
self .loop .run_until_complete (
414
455
self .page .evaluate ("document.activeElement.click()" )
415
456
)
416
457
self .__slow_mode_pause_if_set ()
458
+ self .loop .run_until_complete (self .page .wait ())
417
459
418
460
def click_if_visible (self , selector ):
419
461
if self .is_element_visible (selector ):
420
462
self .find_element (selector ).click ()
421
463
self .__slow_mode_pause_if_set ()
464
+ self .loop .run_until_complete (self .page .wait ())
422
465
423
466
def mouse_click (self , selector , timeout = settings .SMALL_TIMEOUT ):
424
467
"""(Attempt simulating a mouse click)"""
@@ -427,6 +470,7 @@ def mouse_click(self, selector, timeout=settings.SMALL_TIMEOUT):
427
470
self .__add_light_pause ()
428
471
element .mouse_click ()
429
472
self .__slow_mode_pause_if_set ()
473
+ self .loop .run_until_complete (self .page .wait ())
430
474
431
475
def nested_click (self , parent_selector , selector ):
432
476
"""
@@ -436,6 +480,7 @@ def nested_click(self, parent_selector, selector):
436
480
element = self .find_element (parent_selector )
437
481
element .query_selector (selector ).mouse_click ()
438
482
self .__slow_mode_pause_if_set ()
483
+ self .loop .run_until_complete (self .page .wait ())
439
484
440
485
def get_nested_element (self , parent_selector , selector ):
441
486
"""(Can be used to find an element inside an iframe)"""
@@ -483,6 +528,7 @@ def send_keys(self, selector, text, timeout=settings.SMALL_TIMEOUT):
483
528
text = text [:- 1 ] + "\r \n "
484
529
element .send_keys (text )
485
530
self .__slow_mode_pause_if_set ()
531
+ self .loop .run_until_complete (self .page .wait ())
486
532
487
533
def press_keys (self , selector , text , timeout = settings .SMALL_TIMEOUT ):
488
534
"""Similar to send_keys(), but presses keys at human speed."""
@@ -499,6 +545,7 @@ def press_keys(self, selector, text, timeout=settings.SMALL_TIMEOUT):
499
545
element .send_keys ("\r \n " )
500
546
time .sleep (0.0375 )
501
547
self .__slow_mode_pause_if_set ()
548
+ self .loop .run_until_complete (self .page .wait ())
502
549
503
550
def type (self , selector , text , timeout = settings .SMALL_TIMEOUT ):
504
551
"""Similar to send_keys(), but clears the text field first."""
@@ -510,6 +557,7 @@ def type(self, selector, text, timeout=settings.SMALL_TIMEOUT):
510
557
text = text [:- 1 ] + "\r \n "
511
558
element .send_keys (text )
512
559
self .__slow_mode_pause_if_set ()
560
+ self .loop .run_until_complete (self .page .wait ())
513
561
514
562
def evaluate (self , expression ):
515
563
"""Run a JavaScript expression and return the result."""
@@ -760,6 +808,10 @@ def get_element_html(self, selector):
760
808
)
761
809
)
762
810
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
+
763
815
def set_attributes (self , selector , attribute , value ):
764
816
"""This method uses JavaScript to set/update a common attribute.
765
817
All matching selectors from querySelectorAll() are used.
0 commit comments