@@ -54,6 +54,8 @@ def test_anything(self):
54
54
logging .getLogger ("urllib3" ).setLevel (logging .ERROR )
55
55
urllib3 .disable_warnings ()
56
56
LOGGER .setLevel (logging .WARNING )
57
+ SSMD = constants .Values .SSMD # Smooth Scrolling
58
+ JS_Exc = selenium_exceptions .JavascriptException
57
59
ECI_Exception = selenium_exceptions .ElementClickInterceptedException
58
60
ENI_Exception = selenium_exceptions .ElementNotInteractableException
59
61
@@ -136,7 +138,7 @@ def click(self, selector, by=By.CSS_SELECTOR, timeout=None, delay=0):
136
138
element = page_actions .wait_for_element_visible (
137
139
self .driver , selector , by , timeout = timeout )
138
140
self .__demo_mode_highlight_if_active (selector , by )
139
- if not self .demo_mode :
141
+ if not self .demo_mode and not self . slow_mode :
140
142
self .__scroll_to_element (element , selector , by )
141
143
pre_action_url = self .driver .current_url
142
144
if delay and delay > 0 :
@@ -199,8 +201,10 @@ def slow_click(self, selector, by=By.CSS_SELECTOR, timeout=None):
199
201
timeout = settings .SMALL_TIMEOUT
200
202
if self .timeout_multiplier and timeout == settings .SMALL_TIMEOUT :
201
203
timeout = self .__get_new_timeout (timeout )
202
- if not self .demo_mode :
204
+ if not self .demo_mode and not self . slow_mode :
203
205
self .click (selector , by = by , timeout = timeout , delay = 1.05 )
206
+ elif self .slow_mode :
207
+ self .click (selector , by = by , timeout = timeout , delay = 0.65 )
204
208
else :
205
209
# Demo Mode already includes a small delay
206
210
self .click (selector , by = by , timeout = timeout , delay = 0.25 )
@@ -215,7 +219,7 @@ def double_click(self, selector, by=By.CSS_SELECTOR, timeout=None):
215
219
element = page_actions .wait_for_element_visible (
216
220
self .driver , selector , by , timeout = timeout )
217
221
self .__demo_mode_highlight_if_active (selector , by )
218
- if not self .demo_mode :
222
+ if not self .demo_mode and not self . slow_mode :
219
223
self .__scroll_to_element (element , selector , by )
220
224
pre_action_url = self .driver .current_url
221
225
try :
@@ -285,7 +289,7 @@ def update_text(self, selector, text, by=By.CSS_SELECTOR,
285
289
element = self .wait_for_element_visible (
286
290
selector , by = by , timeout = timeout )
287
291
self .__demo_mode_highlight_if_active (selector , by )
288
- if not self .demo_mode :
292
+ if not self .demo_mode and not self . slow_mode :
289
293
self .__scroll_to_element (element , selector , by )
290
294
try :
291
295
element .clear ()
@@ -353,7 +357,7 @@ def add_text(self, selector, text, by=By.CSS_SELECTOR, timeout=None):
353
357
element = self .wait_for_element_visible (
354
358
selector , by = by , timeout = timeout )
355
359
self .__demo_mode_highlight_if_active (selector , by )
356
- if not self .demo_mode :
360
+ if not self .demo_mode and not self . slow_mode :
357
361
self .__scroll_to_element (element , selector , by )
358
362
pre_action_url = self .driver .current_url
359
363
try :
@@ -460,17 +464,23 @@ def get_user_agent(self):
460
464
461
465
def go_back (self ):
462
466
self .__last_page_load_url = None
463
- self .driver .back ()
464
- if self .browser == "safari" :
465
- self .driver .refresh ()
467
+ if self .browser != "safari" :
468
+ self .driver .back ()
469
+ else :
470
+ self .sleep (0.05 )
471
+ self .execute_script ("window.location=document.referrer;" )
472
+ self .sleep (0.05 )
466
473
self .wait_for_ready_state_complete ()
467
474
self .__demo_mode_pause_if_active ()
468
475
469
476
def go_forward (self ):
470
477
self .__last_page_load_url = None
471
- self .driver .forward ()
472
- if self .browser == "safari" :
473
- self .driver .refresh ()
478
+ if self .browser != "safari" :
479
+ self .driver .forward ()
480
+ else :
481
+ self .sleep (0.05 )
482
+ self .execute_script ("window.history.forward();" )
483
+ self .sleep (0.05 )
474
484
self .wait_for_ready_state_complete ()
475
485
self .__demo_mode_pause_if_active ()
476
486
@@ -593,6 +603,23 @@ def click_link_text(self, link_text, timeout=None):
593
603
self .open (self .__get_href_from_link_text (link_text ))
594
604
return
595
605
if self .browser == "safari" :
606
+ if self .demo_mode :
607
+ self .wait_for_link_text_present (link_text , timeout = timeout )
608
+ try :
609
+ self .__jquery_slow_scroll_to (link_text , by = By .LINK_TEXT )
610
+ except Exception :
611
+ pass
612
+ o_bs = '' # original_box_shadow
613
+ loops = settings .HIGHLIGHTS
614
+ selector = self .convert_to_css_selector (
615
+ link_text , by = By .LINK_TEXT )
616
+ selector = self .__make_css_match_first_element_only (selector )
617
+ try :
618
+ selector = re .escape (selector )
619
+ selector = self .__escape_quotes_if_needed (selector )
620
+ self .__highlight_with_jquery (selector , loops , o_bs )
621
+ except Exception :
622
+ pass # JQuery probably couldn't load. Skip highlighting.
596
623
self .__jquery_click (link_text , by = By .LINK_TEXT )
597
624
return
598
625
if not self .is_link_text_present (link_text ):
@@ -1029,7 +1056,7 @@ def click_visible_elements(self, selector, by=By.CSS_SELECTOR, limit=0):
1029
1056
continue # ElementClickInterceptedException (Overlay likely)
1030
1057
except (StaleElementReferenceException , ENI_Exception ):
1031
1058
self .wait_for_ready_state_complete ()
1032
- time .sleep (0.03 )
1059
+ time .sleep (0.04 )
1033
1060
try :
1034
1061
if element .is_displayed ():
1035
1062
self .__scroll_to_element (element )
@@ -1057,7 +1084,7 @@ def click_nth_visible_element(self, selector, number, by=By.CSS_SELECTOR):
1057
1084
element .click ()
1058
1085
except (StaleElementReferenceException , ENI_Exception ):
1059
1086
self .wait_for_ready_state_complete ()
1060
- time .sleep (0.05 )
1087
+ time .sleep (0.03 )
1061
1088
self .__scroll_to_element (element )
1062
1089
element .click ()
1063
1090
@@ -1371,7 +1398,7 @@ def __select_option(self, dropdown_selector, option,
1371
1398
Select (element ).select_by_visible_text (option )
1372
1399
except (StaleElementReferenceException , ENI_Exception ):
1373
1400
self .wait_for_ready_state_complete ()
1374
- time .sleep (0.05 )
1401
+ time .sleep (0.03 )
1375
1402
element = self .wait_for_element_present (
1376
1403
dropdown_selector , by = dropdown_by , timeout = timeout )
1377
1404
if option_by == "index" :
@@ -1581,11 +1608,11 @@ def safe_execute_script(self, script):
1581
1608
it's important that the jQuery library has been loaded first.
1582
1609
This method will load jQuery if it wasn't already loaded. """
1583
1610
try :
1584
- self .execute_script (script )
1611
+ return self .execute_script (script )
1585
1612
except Exception :
1586
1613
# The likely reason this fails is because: "jQuery is not defined"
1587
1614
self .activate_jquery () # It's a good thing we can define it here
1588
- self .execute_script (script )
1615
+ return self .execute_script (script )
1589
1616
1590
1617
def set_window_rect (self , x , y , width , height ):
1591
1618
self .driver .set_window_rect (x , y , width , height )
@@ -2047,10 +2074,18 @@ def highlight(self, selector, by=By.CSS_SELECTOR,
2047
2074
loops = settings .HIGHLIGHTS
2048
2075
if scroll :
2049
2076
try :
2050
- self .__slow_scroll_to_element (element )
2051
- except (StaleElementReferenceException , ENI_Exception ):
2077
+ if self .browser != "safari" :
2078
+ scroll_distance = js_utils .get_scroll_distance_to_element (
2079
+ self .driver , element )
2080
+ if abs (scroll_distance ) > SSMD :
2081
+ self .__jquery_slow_scroll_to (selector , by )
2082
+ else :
2083
+ self .__slow_scroll_to_element (element )
2084
+ else :
2085
+ self .__jquery_slow_scroll_to (selector , by )
2086
+ except (StaleElementReferenceException , ENI_Exception , JS_Exc ):
2052
2087
self .wait_for_ready_state_complete ()
2053
- time .sleep (0.05 )
2088
+ time .sleep (0.03 )
2054
2089
element = self .wait_for_element_visible (
2055
2090
selector , by = by , timeout = settings .SMALL_TIMEOUT )
2056
2091
self .__slow_scroll_to_element (element )
@@ -2071,7 +2106,7 @@ def highlight(self, selector, by=By.CSS_SELECTOR,
2071
2106
style = element .get_attribute ('style' )
2072
2107
except (StaleElementReferenceException , ENI_Exception ):
2073
2108
self .wait_for_ready_state_complete ()
2074
- time .sleep (0.05 )
2109
+ time .sleep (0.03 )
2075
2110
element = self .wait_for_element_visible (
2076
2111
selector , by = By .CSS_SELECTOR , timeout = settings .SMALL_TIMEOUT )
2077
2112
style = element .get_attribute ('style' )
@@ -2110,7 +2145,7 @@ def press_up_arrow(self, selector="html", times=1, by=By.CSS_SELECTOR):
2110
2145
return
2111
2146
element = self .wait_for_element_present (selector )
2112
2147
self .__demo_mode_highlight_if_active (selector , by )
2113
- if not self .demo_mode :
2148
+ if not self .demo_mode and not self . slow_mode :
2114
2149
self .__scroll_to_element (element , selector , by )
2115
2150
for i in range (int (times )):
2116
2151
try :
@@ -2131,7 +2166,7 @@ def press_down_arrow(self, selector="html", times=1, by=By.CSS_SELECTOR):
2131
2166
return
2132
2167
element = self .wait_for_element_present (selector )
2133
2168
self .__demo_mode_highlight_if_active (selector , by )
2134
- if not self .demo_mode :
2169
+ if not self .demo_mode and not self . slow_mode :
2135
2170
self .__scroll_to_element (element , selector , by )
2136
2171
for i in range (int (times )):
2137
2172
try :
@@ -2152,7 +2187,7 @@ def press_left_arrow(self, selector="html", times=1, by=By.CSS_SELECTOR):
2152
2187
return
2153
2188
element = self .wait_for_element_present (selector )
2154
2189
self .__demo_mode_highlight_if_active (selector , by )
2155
- if not self .demo_mode :
2190
+ if not self .demo_mode and not self . slow_mode :
2156
2191
self .__scroll_to_element (element , selector , by )
2157
2192
for i in range (int (times )):
2158
2193
try :
@@ -2173,7 +2208,7 @@ def press_right_arrow(self, selector="html", times=1, by=By.CSS_SELECTOR):
2173
2208
return
2174
2209
element = self .wait_for_element_present (selector )
2175
2210
self .__demo_mode_highlight_if_active (selector , by )
2176
- if not self .demo_mode :
2211
+ if not self .demo_mode and not self . slow_mode :
2177
2212
self .__scroll_to_element (element , selector , by )
2178
2213
for i in range (int (times )):
2179
2214
try :
@@ -2201,7 +2236,7 @@ def scroll_to(self, selector, by=By.CSS_SELECTOR, timeout=None):
2201
2236
self .__scroll_to_element (element , selector , by )
2202
2237
except (StaleElementReferenceException , ENI_Exception ):
2203
2238
self .wait_for_ready_state_complete ()
2204
- time .sleep (0.05 )
2239
+ time .sleep (0.03 )
2205
2240
element = self .wait_for_element_visible (
2206
2241
selector , by = by , timeout = timeout )
2207
2242
self .__scroll_to_element (element , selector , by )
@@ -2216,10 +2251,15 @@ def slow_scroll_to(self, selector, by=By.CSS_SELECTOR, timeout=None):
2216
2251
element = self .wait_for_element_visible (
2217
2252
selector , by = by , timeout = timeout )
2218
2253
try :
2219
- self .__slow_scroll_to_element (element )
2220
- except (StaleElementReferenceException , ENI_Exception ):
2254
+ scroll_distance = js_utils .get_scroll_distance_to_element (
2255
+ self .driver , element )
2256
+ if abs (scroll_distance ) > SSMD :
2257
+ self .__jquery_slow_scroll_to (selector , by )
2258
+ else :
2259
+ self .__slow_scroll_to_element (element )
2260
+ except (StaleElementReferenceException , ENI_Exception , JS_Exc ):
2221
2261
self .wait_for_ready_state_complete ()
2222
- time .sleep (0.05 )
2262
+ time .sleep (0.03 )
2223
2263
element = self .wait_for_element_visible (
2224
2264
selector , by = by , timeout = timeout )
2225
2265
self .__slow_scroll_to_element (element )
@@ -2266,7 +2306,7 @@ def js_click(self, selector, by=By.CSS_SELECTOR, all_matches=False):
2266
2306
selector , by = by , timeout = settings .SMALL_TIMEOUT )
2267
2307
if self .is_element_visible (selector , by = by ):
2268
2308
self .__demo_mode_highlight_if_active (selector , by )
2269
- if not self .demo_mode :
2309
+ if not self .demo_mode and not self . slow_mode :
2270
2310
self .__scroll_to_element (element , selector , by )
2271
2311
css_selector = self .convert_to_css_selector (selector , by = by )
2272
2312
css_selector = re .escape (css_selector )
@@ -2880,7 +2920,7 @@ def set_value(self, selector, text, by=By.CSS_SELECTOR, timeout=None):
2880
2920
orginal_selector = selector
2881
2921
css_selector = self .convert_to_css_selector (selector , by = by )
2882
2922
self .__demo_mode_highlight_if_active (orginal_selector , by )
2883
- if not self .demo_mode :
2923
+ if not self .demo_mode and not self . slow_mode :
2884
2924
self .scroll_to (orginal_selector , by = by , timeout = timeout )
2885
2925
if type (text ) is int or type (text ) is float :
2886
2926
text = str (text )
@@ -5578,6 +5618,30 @@ def __js_click_all(self, selector, by=By.CSS_SELECTOR):
5578
5618
% css_selector )
5579
5619
self .execute_script (script )
5580
5620
5621
+ def __jquery_slow_scroll_to (self , selector , by = By .CSS_SELECTOR ):
5622
+ selector , by = self .__recalculate_selector (selector , by )
5623
+ element = self .wait_for_element_present (
5624
+ selector , by = by , timeout = settings .SMALL_TIMEOUT )
5625
+ dist = js_utils .get_scroll_distance_to_element (self .driver , element )
5626
+ time_offset = 0
5627
+ try :
5628
+ if dist and abs (dist ) > SSMD :
5629
+ time_offset = int (float (abs (dist ) - SSMD ) / 12.5 )
5630
+ if time_offset > 950 :
5631
+ time_offset = 950
5632
+ except Exception :
5633
+ time_offset = 0
5634
+ scroll_time_ms = 550 + time_offset
5635
+ sleep_time = 0.625 + (float (time_offset ) / 1000.0 )
5636
+ selector = self .convert_to_css_selector (selector , by = by )
5637
+ selector = self .__make_css_match_first_element_only (selector )
5638
+ scroll_script = (
5639
+ """jQuery([document.documentElement, document.body]).animate({
5640
+ scrollTop: jQuery('%s').offset().top - 130}, %s);
5641
+ """ % (selector , scroll_time_ms ))
5642
+ self .safe_execute_script (scroll_script )
5643
+ self .sleep (sleep_time )
5644
+
5581
5645
def __jquery_click (self , selector , by = By .CSS_SELECTOR ):
5582
5646
""" Clicks an element using jQuery. Different from using pure JS. """
5583
5647
selector , by = self .__recalculate_selector (selector , by )
@@ -5762,17 +5826,24 @@ def __demo_mode_highlight_if_active(self, selector, by):
5762
5826
self .highlight (selector , by = by )
5763
5827
elif self .slow_mode :
5764
5828
# Just do the slow scroll part of the highlight() method
5829
+ self .sleep (0.08 )
5765
5830
selector , by = self .__recalculate_selector (selector , by )
5766
5831
element = self .wait_for_element_visible (
5767
5832
selector , by = by , timeout = settings .SMALL_TIMEOUT )
5768
5833
try :
5769
- self .__slow_scroll_to_element (element )
5834
+ scroll_distance = js_utils .get_scroll_distance_to_element (
5835
+ self .driver , element )
5836
+ if abs (scroll_distance ) > SSMD :
5837
+ self .__jquery_slow_scroll_to (selector , by )
5838
+ else :
5839
+ self .__slow_scroll_to_element (element )
5770
5840
except (StaleElementReferenceException , ENI_Exception ):
5771
5841
self .wait_for_ready_state_complete ()
5772
- time .sleep (0.05 )
5842
+ time .sleep (0.03 )
5773
5843
element = self .wait_for_element_visible (
5774
5844
selector , by = by , timeout = settings .SMALL_TIMEOUT )
5775
5845
self .__slow_scroll_to_element (element )
5846
+ self .sleep (0.12 )
5776
5847
5777
5848
def __scroll_to_element (self , element , selector = None , by = By .CSS_SELECTOR ):
5778
5849
success = js_utils .scroll_to_element (self .driver , element )
@@ -5796,10 +5867,15 @@ def __highlight_with_assert_success(
5796
5867
# Don't highlight if can't convert to CSS_SELECTOR
5797
5868
return
5798
5869
try :
5799
- self .__slow_scroll_to_element (element )
5870
+ scroll_distance = js_utils .get_scroll_distance_to_element (
5871
+ self .driver , element )
5872
+ if abs (scroll_distance ) > SSMD :
5873
+ self .__jquery_slow_scroll_to (selector , by )
5874
+ else :
5875
+ self .__slow_scroll_to_element (element )
5800
5876
except (StaleElementReferenceException , ENI_Exception ):
5801
5877
self .wait_for_ready_state_complete ()
5802
- time .sleep (0.05 )
5878
+ time .sleep (0.03 )
5803
5879
element = self .wait_for_element_visible (
5804
5880
selector , by = by , timeout = settings .SMALL_TIMEOUT )
5805
5881
self .__slow_scroll_to_element (element )
0 commit comments