@@ -987,14 +987,30 @@ def hover_and_click(self, hover_selector, click_selector,
987
987
hover_selector , hover_by )
988
988
click_selector , click_by = self .__recalculate_selector (
989
989
click_selector , click_by )
990
- self .wait_for_element_visible (
990
+ dropdown_element = self .wait_for_element_visible (
991
991
hover_selector , by = hover_by , timeout = timeout )
992
992
self .__demo_mode_highlight_if_active (hover_selector , hover_by )
993
993
self .scroll_to (hover_selector , by = hover_by )
994
994
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 )
998
1014
if self .demo_mode :
999
1015
if self .driver .current_url != pre_action_url :
1000
1016
self .__demo_mode_pause_if_active ()
@@ -1016,20 +1032,36 @@ def hover_and_double_click(self, hover_selector, click_selector,
1016
1032
hover_selector , hover_by )
1017
1033
click_selector , click_by = self .__recalculate_selector (
1018
1034
click_selector , click_by )
1019
- hover_element = self .wait_for_element_visible (
1035
+ dropdown_element = self .wait_for_element_visible (
1020
1036
hover_selector , by = hover_by , timeout = timeout )
1021
1037
self .__demo_mode_highlight_if_active (hover_selector , hover_by )
1022
1038
self .scroll_to (hover_selector , by = hover_by )
1023
1039
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 )
1027
1059
if self .demo_mode :
1028
1060
if self .driver .current_url != pre_action_url :
1029
1061
self .__demo_mode_pause_if_active ()
1030
1062
else :
1031
1063
self .__demo_mode_pause_if_active (tiny = True )
1032
- return click_element
1064
+ return element
1033
1065
1034
1066
def __select_option (self , dropdown_selector , option ,
1035
1067
dropdown_by = By .CSS_SELECTOR , option_by = "text" ,
@@ -3242,14 +3274,24 @@ def __click_dropdown_link_text(self, link_text, link_css):
3242
3274
matching_dropdowns = self .find_visible_elements (dropdown_css )
3243
3275
for dropdown in matching_dropdowns :
3244
3276
# 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
3247
3288
page_actions .hover_element_and_click (
3248
3289
self .driver , dropdown , link_text ,
3249
3290
click_by = By .LINK_TEXT , timeout = 0.12 )
3250
3291
return True
3251
- except Exception :
3252
- pass
3292
+ except Exception :
3293
+ pass
3294
+
3253
3295
return False
3254
3296
3255
3297
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):
3288
3330
matching_dropdowns = self .find_visible_elements (dropdown_css )
3289
3331
for dropdown in matching_dropdowns :
3290
3332
# 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
3293
3345
page_actions .hover_element_and_click (
3294
3346
self .driver , dropdown , link_text ,
3295
- click_by = By .PARTIAL_LINK_TEXT , timeout = 0.12 )
3347
+ click_by = By .LINK_TEXT , timeout = 0.12 )
3296
3348
return True
3297
- except Exception :
3298
- pass
3349
+ except Exception :
3350
+ pass
3299
3351
return False
3300
3352
3301
3353
def __recalculate_selector (self , selector , by ):
0 commit comments