Skip to content

Commit 7be5b6f

Browse files
committed
Improve automation on Safari
1 parent ed68e3e commit 7be5b6f

File tree

1 file changed

+35
-8
lines changed

1 file changed

+35
-8
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ def click(self, selector, by=By.CSS_SELECTOR, timeout=None, delay=0):
146146
if self.browser == 'ie' and by == By.LINK_TEXT:
147147
# An issue with clicking Link Text on IE means using jquery
148148
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)
149154
else:
150155
# Normal click
151156
element.click()
@@ -594,6 +599,9 @@ def click_link_text(self, link_text, timeout=None):
594599
return
595600
self.open(self.__get_href_from_link_text(link_text))
596601
return
602+
if self.browser == "safari":
603+
self.__jquery_click(link_text, by=By.LINK_TEXT)
604+
return
597605
if not self.is_link_text_present(link_text):
598606
self.wait_for_link_text_present(link_text, timeout=timeout)
599607
pre_action_url = self.get_current_url()
@@ -1000,6 +1008,29 @@ def click_visible_elements(self, selector, by=By.CSS_SELECTOR, limit=0):
10001008
self.wait_for_element_present(
10011009
selector, by=by, timeout=settings.SMALL_TIMEOUT)
10021010
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
10031034
click_count = 0
10041035
for element in elements:
10051036
if limit and limit > 0 and click_count >= limit:
@@ -1206,6 +1237,9 @@ def hover_and_click(self, hover_selector, click_selector,
12061237
outdated_driver = False
12071238
element = None
12081239
try:
1240+
if self.browser == "safari":
1241+
# Use the workaround for hover-clicking on Safari
1242+
raise Exception("This Exception will be caught.")
12091243
page_actions.hover_element(self.driver, dropdown_element)
12101244
except Exception:
12111245
outdated_driver = True
@@ -2150,6 +2184,7 @@ def js_click(self, selector, by=By.CSS_SELECTOR, all_matches=False):
21502184
self.__js_click(selector, by=by) # The real "magic" happens
21512185
else:
21522186
self.__js_click_all(selector, by=by) # The real "magic" happens
2187+
self.wait_for_ready_state_complete()
21532188
self.__demo_mode_pause_if_active()
21542189

21552190
def js_click_all(self, selector, by=By.CSS_SELECTOR):
@@ -4233,8 +4268,6 @@ def __jquery_click(self, selector, by=By.CSS_SELECTOR):
42334268
selector, by = self.__recalculate_selector(selector, by)
42344269
self.wait_for_element_present(
42354270
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)
42384271
selector = self.convert_to_css_selector(selector, by=by)
42394272
selector = self.__make_css_match_first_element_only(selector)
42404273
click_script = """jQuery('%s')[0].click()""" % selector
@@ -4365,12 +4398,6 @@ def __recalculate_selector(self, selector, by):
43654398
name = page_utils.get_name_from_selector(selector)
43664399
selector = '[name="%s"]' % name
43674400
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
43744401
return (selector, by)
43754402

43764403
def __make_css_match_first_element_only(self, selector):

0 commit comments

Comments
 (0)