Skip to content

Commit ea02a37

Browse files
committed
Improve handling of "hover + click" actions
1 parent b3afa25 commit ea02a37

File tree

1 file changed

+70
-18
lines changed

1 file changed

+70
-18
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 70 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -987,14 +987,30 @@ def hover_and_click(self, hover_selector, click_selector,
987987
hover_selector, hover_by)
988988
click_selector, click_by = self.__recalculate_selector(
989989
click_selector, click_by)
990-
self.wait_for_element_visible(
990+
dropdown_element = self.wait_for_element_visible(
991991
hover_selector, by=hover_by, timeout=timeout)
992992
self.__demo_mode_highlight_if_active(hover_selector, hover_by)
993993
self.scroll_to(hover_selector, by=hover_by)
994994
pre_action_url = self.driver.current_url
995-
element = page_actions.hover_and_click(
996-
self.driver, hover_selector, click_selector,
997-
hover_by, click_by, timeout)
995+
outdated_driver = False
996+
element = None
997+
try:
998+
page_actions.hover_element(self.driver, dropdown_element)
999+
except Exception:
1000+
outdated_driver = True
1001+
element = self.wait_for_element_present(
1002+
click_selector, click_by, timeout)
1003+
if click_by == By.LINK_TEXT:
1004+
self.open(self.__get_href_from_link_text(click_selector))
1005+
elif click_by == By.PARTIAL_LINK_TEXT:
1006+
self.open(self.__get_href_from_partial_link_text(
1007+
click_selector))
1008+
else:
1009+
self.js_click(click_selector, click_by)
1010+
if not outdated_driver:
1011+
element = page_actions.hover_and_click(
1012+
self.driver, hover_selector, click_selector,
1013+
hover_by, click_by, timeout)
9981014
if self.demo_mode:
9991015
if self.driver.current_url != pre_action_url:
10001016
self.__demo_mode_pause_if_active()
@@ -1016,20 +1032,36 @@ def hover_and_double_click(self, hover_selector, click_selector,
10161032
hover_selector, hover_by)
10171033
click_selector, click_by = self.__recalculate_selector(
10181034
click_selector, click_by)
1019-
hover_element = self.wait_for_element_visible(
1035+
dropdown_element = self.wait_for_element_visible(
10201036
hover_selector, by=hover_by, timeout=timeout)
10211037
self.__demo_mode_highlight_if_active(hover_selector, hover_by)
10221038
self.scroll_to(hover_selector, by=hover_by)
10231039
pre_action_url = self.driver.current_url
1024-
click_element = page_actions.hover_element_and_double_click(
1025-
self.driver, hover_element, click_selector,
1026-
click_by=By.CSS_SELECTOR, timeout=timeout)
1040+
outdated_driver = False
1041+
element = None
1042+
try:
1043+
page_actions.hover_element(self.driver, dropdown_element)
1044+
except Exception:
1045+
outdated_driver = True
1046+
element = self.wait_for_element_present(
1047+
click_selector, click_by, timeout)
1048+
if click_by == By.LINK_TEXT:
1049+
self.open(self.__get_href_from_link_text(click_selector))
1050+
elif click_by == By.PARTIAL_LINK_TEXT:
1051+
self.open(self.__get_href_from_partial_link_text(
1052+
click_selector))
1053+
else:
1054+
self.js_click(click_selector, click_by)
1055+
if not outdated_driver:
1056+
element = page_actions.hover_element_and_double_click(
1057+
self.driver, dropdown_element, click_selector,
1058+
click_by=By.CSS_SELECTOR, timeout=timeout)
10271059
if self.demo_mode:
10281060
if self.driver.current_url != pre_action_url:
10291061
self.__demo_mode_pause_if_active()
10301062
else:
10311063
self.__demo_mode_pause_if_active(tiny=True)
1032-
return click_element
1064+
return element
10331065

10341066
def __select_option(self, dropdown_selector, option,
10351067
dropdown_by=By.CSS_SELECTOR, option_by="text",
@@ -3242,14 +3274,24 @@ def __click_dropdown_link_text(self, link_text, link_css):
32423274
matching_dropdowns = self.find_visible_elements(dropdown_css)
32433275
for dropdown in matching_dropdowns:
32443276
# The same class names might be used for multiple dropdowns
3245-
try:
3246-
if dropdown.is_displayed():
3277+
if dropdown.is_displayed():
3278+
try:
3279+
try:
3280+
page_actions.hover_element(
3281+
self.driver, dropdown)
3282+
except Exception:
3283+
# If hovering fails, driver is likely outdated
3284+
# Time to go directly to the hidden link text
3285+
self.open(self.__get_href_from_link_text(
3286+
link_text))
3287+
return True
32473288
page_actions.hover_element_and_click(
32483289
self.driver, dropdown, link_text,
32493290
click_by=By.LINK_TEXT, timeout=0.12)
32503291
return True
3251-
except Exception:
3252-
pass
3292+
except Exception:
3293+
pass
3294+
32533295
return False
32543296

32553297
def __get_href_from_partial_link_text(self, link_text, hard_fail=True):
@@ -3288,14 +3330,24 @@ def __click_dropdown_partial_link_text(self, link_text, link_css):
32883330
matching_dropdowns = self.find_visible_elements(dropdown_css)
32893331
for dropdown in matching_dropdowns:
32903332
# The same class names might be used for multiple dropdowns
3291-
try:
3292-
if dropdown.is_displayed():
3333+
if dropdown.is_displayed():
3334+
try:
3335+
try:
3336+
page_actions.hover_element(
3337+
self.driver, dropdown)
3338+
except Exception:
3339+
# If hovering fails, driver is likely outdated
3340+
# Time to go directly to the hidden link text
3341+
self.open(
3342+
self.__get_href_from_partial_link_text(
3343+
link_text))
3344+
return True
32933345
page_actions.hover_element_and_click(
32943346
self.driver, dropdown, link_text,
3295-
click_by=By.PARTIAL_LINK_TEXT, timeout=0.12)
3347+
click_by=By.LINK_TEXT, timeout=0.12)
32963348
return True
3297-
except Exception:
3298-
pass
3349+
except Exception:
3350+
pass
32993351
return False
33003352

33013353
def __recalculate_selector(self, selector, by):

0 commit comments

Comments
 (0)