@@ -291,20 +291,19 @@ def click(
291
291
pre_action_url = self.driver.current_url
292
292
pre_window_count = len(self.driver.window_handles)
293
293
try:
294
- if self.browser == "ie" and by == By.LINK_TEXT:
295
- # An issue with clicking Link Text on IE means using jquery
294
+ if (
295
+ by == By.LINK_TEXT
296
+ and (
297
+ self.browser == "ie" or self.browser == "safari"
298
+ )
299
+ ):
296
300
self.__jquery_click(selector, by=by)
297
- elif self.browser == "safari":
298
- if by == By.LINK_TEXT:
299
- self.__jquery_click(selector, by=by)
300
- else:
301
- self.__js_click(selector, by=by)
302
301
else:
303
302
href = None
304
303
new_tab = False
305
304
onclick = None
306
305
try:
307
- if self.headless and element.tag_name == "a":
306
+ if self.headless and element.tag_name.lower() == "a":
308
307
# Handle a special case of opening a new tab (headless)
309
308
href = element.get_attribute("href").strip()
310
309
onclick = element.get_attribute("onclick")
@@ -343,11 +342,8 @@ def click(
343
342
self.__scroll_to_element(element, selector, by)
344
343
except Exception:
345
344
pass
346
- if self.browser == "safari":
347
- if by == By.LINK_TEXT:
348
- self.__jquery_click(selector, by=by)
349
- else:
350
- self.__js_click(selector, by=by)
345
+ if self.browser == "safari" and by == By.LINK_TEXT:
346
+ self.__jquery_click(selector, by=by)
351
347
else:
352
348
element.click()
353
349
except ENI_Exception:
@@ -364,7 +360,7 @@ def click(
364
360
new_tab = False
365
361
onclick = None
366
362
try:
367
- if element.tag_name == "a":
363
+ if element.tag_name.lower() == "a":
368
364
# Handle a special case of opening a new tab (non-headless)
369
365
href = element.get_attribute("href").strip()
370
366
onclick = element.get_attribute("onclick")
@@ -1449,10 +1445,11 @@ def get_text(self, selector, by="css selector", timeout=None):
1449
1445
try:
1450
1446
element_text = element.text
1451
1447
if self.browser == "safari":
1452
- element_text = element.get_attribute("innerText")
1453
- if element.tag_name == "input":
1454
- element_text = element.get_property("value")
1455
- if element.tag_name == "textarea":
1448
+ if element.tag_name.lower() in ["input", "textarea"]:
1449
+ element_text = element.get_attribute("value")
1450
+ else:
1451
+ element_text = element.get_attribute("innerText")
1452
+ elif element.tag_name.lower() in ["input", "textarea"]:
1456
1453
element_text = element.get_property("value")
1457
1454
except (StaleElementReferenceException, ENI_Exception):
1458
1455
self.wait_for_ready_state_complete()
@@ -1462,8 +1459,11 @@ def get_text(self, selector, by="css selector", timeout=None):
1462
1459
)
1463
1460
element_text = element.text
1464
1461
if self.browser == "safari":
1465
- element_text = element.get_attribute("innerText")
1466
- if element.tag_name == "input":
1462
+ if element.tag_name.lower() in ["input", "textarea"]:
1463
+ element_text = element.get_attribute("value")
1464
+ else:
1465
+ element_text = element.get_attribute("innerText")
1466
+ elif element.tag_name.lower() in ["input", "textarea"]:
1467
1467
element_text = element.get_property("value")
1468
1468
return element_text
1469
1469
@@ -2128,21 +2128,18 @@ def hover_on_element(self, selector, by="css selector"):
2128
2128
original_selector = selector
2129
2129
original_by = by
2130
2130
selector, by = self.__recalculate_selector(selector, by)
2131
- if page_utils.is_xpath_selector(selector):
2132
- selector = self.convert_to_css_selector(selector, By.XPATH)
2133
- by = By.CSS_SELECTOR
2134
2131
self.wait_for_element_visible(
2135
2132
original_selector, by=original_by, timeout=settings.SMALL_TIMEOUT
2136
2133
)
2137
2134
self.__demo_mode_highlight_if_active(original_selector, original_by)
2138
2135
self.scroll_to(selector, by=by)
2139
2136
time.sleep(0.05) # Settle down from scrolling before hovering
2140
2137
if self.browser != "chrome":
2141
- return page_actions.hover_on_element(self.driver, selector)
2138
+ return page_actions.hover_on_element(self.driver, selector, by )
2142
2139
# Using Chrome
2143
2140
# (Pure hover actions won't work on early chromedriver versions)
2144
2141
try:
2145
- return page_actions.hover_on_element(self.driver, selector)
2142
+ return page_actions.hover_on_element(self.driver, selector, by )
2146
2143
except WebDriverException as e:
2147
2144
driver_capabilities = self.driver.capabilities
2148
2145
if "version" in driver_capabilities:
@@ -2191,8 +2188,6 @@ def hover_and_click(
2191
2188
hover_selector, hover_by = self.__recalculate_selector(
2192
2189
hover_selector, hover_by
2193
2190
)
2194
- hover_selector = self.convert_to_css_selector(hover_selector, hover_by)
2195
- hover_by = By.CSS_SELECTOR
2196
2191
original_click_selector = click_selector
2197
2192
click_selector, click_by = self.__recalculate_selector(
2198
2193
click_selector, click_by
@@ -2224,9 +2219,6 @@ def hover_and_click(
2224
2219
if self.mobile_emulator:
2225
2220
# On mobile, click to hover the element
2226
2221
dropdown_element.click()
2227
- elif self.browser == "safari":
2228
- # Use the workaround for hover-clicking on Safari
2229
- raise Exception("This Exception will be caught.")
2230
2222
else:
2231
2223
page_actions.hover_element(self.driver, dropdown_element)
2232
2224
except Exception:
@@ -2269,6 +2261,12 @@ def hover_and_click(
2269
2261
)
2270
2262
):
2271
2263
self.__switch_to_newest_window_if_not_blank()
2264
+ elif self.browser == "safari":
2265
+ # Release the hover by hovering elsewhere
2266
+ try:
2267
+ page_actions.hover_on_element(self.driver, "body")
2268
+ except Exception:
2269
+ pass
2272
2270
if self.demo_mode:
2273
2271
if self.driver.current_url != pre_action_url:
2274
2272
self.__demo_mode_pause_if_active()
@@ -2630,10 +2628,11 @@ def get_select_options(
2630
2628
raise Exception("The attribute must be in %s" % allowed_attributes)
2631
2629
selector, by = self.__recalculate_selector(selector, by)
2632
2630
element = self.wait_for_element(selector, by=by, timeout=timeout)
2633
- if element.tag_name != "select":
2631
+ if element.tag_name.lower() != "select":
2634
2632
raise Exception(
2635
2633
'Element tag_name for get_select_options(selector) must be a '
2636
- '"select"! Actual tag_name found was: "%s"' % element.tag_name
2634
+ '"select"! Actual tag_name found was: "%s"'
2635
+ % element.tag_name.lower()
2637
2636
)
2638
2637
if by != "css selector":
2639
2638
selector = self.convert_to_css_selector(selector, by=by)
@@ -2717,9 +2716,13 @@ def load_html_string(self, html_string, new_page=True):
2717
2716
html_string = html_string.replace("\\ ", " ")
2718
2717
2719
2718
if new_page:
2720
- self.open("data:text/html,")
2719
+ self.open("data:text/html,<head></head><body></body> ")
2721
2720
inner_head = """document.getElementsByTagName("head")[0].innerHTML"""
2722
2721
inner_body = """document.getElementsByTagName("body")[0].innerHTML"""
2722
+ try:
2723
+ self.wait_for_element_present("body", timeout=1)
2724
+ except Exception:
2725
+ pass
2723
2726
if not found_body:
2724
2727
self.execute_script('''%s = \"%s\"''' % (inner_body, html_string))
2725
2728
elif found_body and not found_head:
@@ -5102,13 +5105,16 @@ def slow_scroll_to(self, selector, by="css selector", timeout=None):
5102
5105
original_selector, by=original_by, timeout=timeout
5103
5106
)
5104
5107
try:
5105
- scroll_distance = js_utils.get_scroll_distance_to_element(
5106
- self.driver, element
5107
- )
5108
- if abs(scroll_distance) > constants.Values.SSMD:
5109
- self.__jquery_slow_scroll_to(selector, by)
5108
+ if self.browser != "safari":
5109
+ scroll_distance = js_utils.get_scroll_distance_to_element(
5110
+ self.driver, element
5111
+ )
5112
+ if abs(scroll_distance) > constants.Values.SSMD:
5113
+ self.__jquery_slow_scroll_to(selector, by)
5114
+ else:
5115
+ self.__slow_scroll_to_element(element)
5110
5116
else:
5111
- self.__slow_scroll_to_element(element )
5117
+ self.__jquery_slow_scroll_to(selector, by )
5112
5118
except Exception:
5113
5119
self.wait_for_ready_state_complete()
5114
5120
time.sleep(0.12)
@@ -6721,7 +6727,7 @@ def set_text(self, selector, text, by="css selector", timeout=None):
6721
6727
element = page_actions.wait_for_element_present(
6722
6728
self.driver, selector, by, timeout
6723
6729
)
6724
- if element.tag_name == "input" or element.tag_name == "textarea":
6730
+ if element.tag_name.lower() in [ "input", "textarea"] :
6725
6731
self.js_update_text(selector, text, by=by, timeout=timeout)
6726
6732
else:
6727
6733
self.set_text_content(selector, text, by=by, timeout=timeout)
@@ -6741,7 +6747,7 @@ def set_text_content(
6741
6747
element = page_actions.wait_for_element_present(
6742
6748
self.driver, selector, by, timeout
6743
6749
)
6744
- if element.tag_name == "input" or element.tag_name == "textarea":
6750
+ if element.tag_name.lower() in [ "input", "textarea"] :
6745
6751
self.js_update_text(selector, text, by=by, timeout=timeout)
6746
6752
return
6747
6753
orginal_selector = selector
@@ -12255,13 +12261,16 @@ def __demo_mode_highlight_if_active(self, selector, by):
12255
12261
selector, by=by, timeout=settings.SMALL_TIMEOUT
12256
12262
)
12257
12263
try:
12258
- scroll_distance = js_utils.get_scroll_distance_to_element(
12259
- self.driver, element
12260
- )
12261
- if abs(scroll_distance) > constants.Values.SSMD:
12262
- self.__jquery_slow_scroll_to(selector, by)
12264
+ if self.browser != "safari":
12265
+ scroll_distance = js_utils.get_scroll_distance_to_element(
12266
+ self.driver, element
12267
+ )
12268
+ if abs(scroll_distance) > constants.Values.SSMD:
12269
+ self.__jquery_slow_scroll_to(selector, by)
12270
+ else:
12271
+ self.__slow_scroll_to_element(element)
12263
12272
else:
12264
- self.__slow_scroll_to_element(element )
12273
+ self.__jquery_slow_scroll_to(selector, by )
12265
12274
except (StaleElementReferenceException, ENI_Exception):
12266
12275
self.wait_for_ready_state_complete()
12267
12276
time.sleep(0.12)
@@ -12295,13 +12304,16 @@ def __highlight_with_assert_success(
12295
12304
selector, by=by, timeout=settings.SMALL_TIMEOUT
12296
12305
)
12297
12306
try:
12298
- scroll_distance = js_utils.get_scroll_distance_to_element(
12299
- self.driver, element
12300
- )
12301
- if abs(scroll_distance) > constants.Values.SSMD:
12302
- self.__jquery_slow_scroll_to(selector, by)
12307
+ if self.browser != "safari":
12308
+ scroll_distance = js_utils.get_scroll_distance_to_element(
12309
+ self.driver, element
12310
+ )
12311
+ if abs(scroll_distance) > constants.Values.SSMD:
12312
+ self.__jquery_slow_scroll_to(selector, by)
12313
+ else:
12314
+ self.__slow_scroll_to_element(element)
12303
12315
else:
12304
- self.__slow_scroll_to_element(element )
12316
+ self.__jquery_slow_scroll_to(selector, by )
12305
12317
except Exception:
12306
12318
self.wait_for_ready_state_complete()
12307
12319
time.sleep(0.12)
0 commit comments