@@ -146,6 +146,11 @@ def click(self, selector, by=By.CSS_SELECTOR, timeout=None, delay=0):
146
146
if self .browser == 'ie' and by == By .LINK_TEXT :
147
147
# An issue with clicking Link Text on IE means using jquery
148
148
self .__jquery_click (selector , by = by )
149
+ elif self .browser == "safari" :
150
+ if by == By .LINK_TEXT :
151
+ self .__jquery_click (selector , by = by )
152
+ else :
153
+ self .__js_click (selector , by = by )
149
154
else :
150
155
# Normal click
151
156
element .click ()
@@ -594,6 +599,9 @@ def click_link_text(self, link_text, timeout=None):
594
599
return
595
600
self .open (self .__get_href_from_link_text (link_text ))
596
601
return
602
+ if self .browser == "safari" :
603
+ self .__jquery_click (link_text , by = By .LINK_TEXT )
604
+ return
597
605
if not self .is_link_text_present (link_text ):
598
606
self .wait_for_link_text_present (link_text , timeout = timeout )
599
607
pre_action_url = self .get_current_url ()
@@ -1000,6 +1008,29 @@ def click_visible_elements(self, selector, by=By.CSS_SELECTOR, limit=0):
1000
1008
self .wait_for_element_present (
1001
1009
selector , by = by , timeout = settings .SMALL_TIMEOUT )
1002
1010
elements = self .find_elements (selector , by = by )
1011
+ if self .browser == "safari" :
1012
+ if not limit :
1013
+ limit = 0
1014
+ num_elements = len (elements )
1015
+ if num_elements == 0 :
1016
+ raise Exception (
1017
+ "No matching elements found for selector {%s}!" % selector )
1018
+ elif num_elements < limit or limit == 0 :
1019
+ limit = num_elements
1020
+ selector , by = self .__recalculate_selector (selector , by )
1021
+ css_selector = self .convert_to_css_selector (selector , by = by )
1022
+ last_css_chunk = css_selector .split (' ' )[- 1 ]
1023
+ if ":" in last_css_chunk :
1024
+ self .__js_click_all (css_selector )
1025
+ self .wait_for_ready_state_complete ()
1026
+ return
1027
+ else :
1028
+ for i in range (1 , limit + 1 ):
1029
+ new_selector = css_selector + ":nth-of-type(%s)" % str (i )
1030
+ if self .is_element_visible (new_selector ):
1031
+ self .__js_click (new_selector )
1032
+ self .wait_for_ready_state_complete ()
1033
+ return
1003
1034
click_count = 0
1004
1035
for element in elements :
1005
1036
if limit and limit > 0 and click_count >= limit :
@@ -1206,6 +1237,9 @@ def hover_and_click(self, hover_selector, click_selector,
1206
1237
outdated_driver = False
1207
1238
element = None
1208
1239
try :
1240
+ if self .browser == "safari" :
1241
+ # Use the workaround for hover-clicking on Safari
1242
+ raise Exception ("This Exception will be caught." )
1209
1243
page_actions .hover_element (self .driver , dropdown_element )
1210
1244
except Exception :
1211
1245
outdated_driver = True
@@ -2150,6 +2184,7 @@ def js_click(self, selector, by=By.CSS_SELECTOR, all_matches=False):
2150
2184
self .__js_click (selector , by = by ) # The real "magic" happens
2151
2185
else :
2152
2186
self .__js_click_all (selector , by = by ) # The real "magic" happens
2187
+ self .wait_for_ready_state_complete ()
2153
2188
self .__demo_mode_pause_if_active ()
2154
2189
2155
2190
def js_click_all (self , selector , by = By .CSS_SELECTOR ):
@@ -4233,8 +4268,6 @@ def __jquery_click(self, selector, by=By.CSS_SELECTOR):
4233
4268
selector , by = self .__recalculate_selector (selector , by )
4234
4269
self .wait_for_element_present (
4235
4270
selector , by = by , timeout = settings .SMALL_TIMEOUT )
4236
- if self .is_element_visible (selector , by = by ):
4237
- self .__demo_mode_highlight_if_active (selector , by )
4238
4271
selector = self .convert_to_css_selector (selector , by = by )
4239
4272
selector = self .__make_css_match_first_element_only (selector )
4240
4273
click_script = """jQuery('%s')[0].click()""" % selector
@@ -4365,12 +4398,6 @@ def __recalculate_selector(self, selector, by):
4365
4398
name = page_utils .get_name_from_selector (selector )
4366
4399
selector = '[name="%s"]' % name
4367
4400
by = By .CSS_SELECTOR
4368
- if by == By .LINK_TEXT or by == By .PARTIAL_LINK_TEXT :
4369
- if self .browser == "safari" and selector .lower () != selector :
4370
- selector = ("""//a[contains(translate(.,"ABCDEFGHIJKLMNOPQR"""
4371
- """STUVWXYZ","abcdefghijklmnopqrstuvw"""
4372
- """xyz"),"%s")]""" % selector .lower ())
4373
- by = By .XPATH
4374
4401
return (selector , by )
4375
4402
4376
4403
def __make_css_match_first_element_only (self , selector ):
0 commit comments