@@ -134,6 +134,8 @@ def click(self, selector, by=By.CSS_SELECTOR, timeout=None, delay=0):
134
134
timeout = settings .SMALL_TIMEOUT
135
135
if self .timeout_multiplier and timeout == settings .SMALL_TIMEOUT :
136
136
timeout = self .__get_new_timeout (timeout )
137
+ original_selector = selector
138
+ original_by = by
137
139
selector , by = self .__recalculate_selector (selector , by )
138
140
if page_utils .is_link_text_selector (selector ) or by == By .LINK_TEXT :
139
141
if not self .is_link_text_visible (selector ):
@@ -148,7 +150,7 @@ def click(self, selector, by=By.CSS_SELECTOR, timeout=None, delay=0):
148
150
return
149
151
element = page_actions .wait_for_element_visible (
150
152
self .driver , selector , by , timeout = timeout )
151
- self .__demo_mode_highlight_if_active (selector , by )
153
+ self .__demo_mode_highlight_if_active (original_selector , original_by )
152
154
if not self .demo_mode and not self .slow_mode :
153
155
self .__scroll_to_element (element , selector , by )
154
156
pre_action_url = self .driver .current_url
@@ -226,10 +228,12 @@ def double_click(self, selector, by=By.CSS_SELECTOR, timeout=None):
226
228
timeout = settings .SMALL_TIMEOUT
227
229
if self .timeout_multiplier and timeout == settings .SMALL_TIMEOUT :
228
230
timeout = self .__get_new_timeout (timeout )
231
+ original_selector = selector
232
+ original_by = by
229
233
selector , by = self .__recalculate_selector (selector , by )
230
234
element = page_actions .wait_for_element_visible (
231
235
self .driver , selector , by , timeout = timeout )
232
- self .__demo_mode_highlight_if_active (selector , by )
236
+ self .__demo_mode_highlight_if_active (original_selector , original_by )
233
237
if not self .demo_mode and not self .slow_mode :
234
238
self .__scroll_to_element (element , selector , by )
235
239
pre_action_url = self .driver .current_url
@@ -1289,13 +1293,15 @@ def switch_to_frame_of_element(self, selector, by=By.CSS_SELECTOR):
1289
1293
"element {%s}!" % selector )
1290
1294
1291
1295
def hover_on_element (self , selector , by = By .CSS_SELECTOR ):
1296
+ original_selector = selector
1297
+ original_by = by
1292
1298
selector , by = self .__recalculate_selector (selector , by )
1293
1299
if page_utils .is_xpath_selector (selector ):
1294
1300
selector = self .convert_to_css_selector (selector , By .XPATH )
1295
1301
by = By .CSS_SELECTOR
1296
1302
self .wait_for_element_visible (
1297
1303
selector , by = by , timeout = settings .SMALL_TIMEOUT )
1298
- self .__demo_mode_highlight_if_active (selector , by )
1304
+ self .__demo_mode_highlight_if_active (original_selector , original_by )
1299
1305
self .scroll_to (selector , by = by )
1300
1306
time .sleep (0.05 ) # Settle down from scrolling before hovering
1301
1307
if self .browser != "chrome" :
@@ -1339,6 +1345,8 @@ def hover_and_click(self, hover_selector, click_selector,
1339
1345
timeout = settings .SMALL_TIMEOUT
1340
1346
if self .timeout_multiplier and timeout == settings .SMALL_TIMEOUT :
1341
1347
timeout = self .__get_new_timeout (timeout )
1348
+ original_selector = hover_selector
1349
+ original_by = hover_by
1342
1350
hover_selector , hover_by = self .__recalculate_selector (
1343
1351
hover_selector , hover_by )
1344
1352
hover_selector = self .convert_to_css_selector (
@@ -1348,7 +1356,7 @@ def hover_and_click(self, hover_selector, click_selector,
1348
1356
click_selector , click_by )
1349
1357
dropdown_element = self .wait_for_element_visible (
1350
1358
hover_selector , by = hover_by , timeout = timeout )
1351
- self .__demo_mode_highlight_if_active (hover_selector , hover_by )
1359
+ self .__demo_mode_highlight_if_active (original_selector , original_by )
1352
1360
self .scroll_to (hover_selector , by = hover_by )
1353
1361
pre_action_url = self .driver .current_url
1354
1362
outdated_driver = False
@@ -1400,6 +1408,8 @@ def hover_and_double_click(self, hover_selector, click_selector,
1400
1408
timeout = settings .SMALL_TIMEOUT
1401
1409
if self .timeout_multiplier and timeout == settings .SMALL_TIMEOUT :
1402
1410
timeout = self .__get_new_timeout (timeout )
1411
+ original_selector = hover_selector
1412
+ original_by = hover_by
1403
1413
hover_selector , hover_by = self .__recalculate_selector (
1404
1414
hover_selector , hover_by )
1405
1415
hover_selector = self .convert_to_css_selector (
@@ -1409,7 +1419,7 @@ def hover_and_double_click(self, hover_selector, click_selector,
1409
1419
click_selector , click_by )
1410
1420
dropdown_element = self .wait_for_element_visible (
1411
1421
hover_selector , by = hover_by , timeout = timeout )
1412
- self .__demo_mode_highlight_if_active (hover_selector , hover_by )
1422
+ self .__demo_mode_highlight_if_active (original_selector , original_by )
1413
1423
self .scroll_to (hover_selector , by = hover_by )
1414
1424
pre_action_url = self .driver .current_url
1415
1425
outdated_driver = False
@@ -2239,7 +2249,7 @@ def highlight(self, selector, by=By.CSS_SELECTOR,
2239
2249
(Default: 4. Each loop lasts for about 0.18s)
2240
2250
scroll - the option to scroll to the element first (Default: True)
2241
2251
"""
2242
- selector , by = self .__recalculate_selector (selector , by )
2252
+ selector , by = self .__recalculate_selector (selector , by , xp_ok = False )
2243
2253
element = self .wait_for_element_visible (
2244
2254
selector , by = by , timeout = settings .SMALL_TIMEOUT )
2245
2255
if not loops :
@@ -2464,7 +2474,7 @@ def click_xpath(self, xpath):
2464
2474
def js_click (self , selector , by = By .CSS_SELECTOR , all_matches = False ):
2465
2475
""" Clicks an element using JavaScript.
2466
2476
If "all_matches" is False, only the first match is clicked. """
2467
- selector , by = self .__recalculate_selector (selector , by )
2477
+ selector , by = self .__recalculate_selector (selector , by , xp_ok = False )
2468
2478
if by == By .LINK_TEXT :
2469
2479
message = (
2470
2480
"Pure JavaScript doesn't support clicking by Link Text. "
@@ -2504,7 +2514,7 @@ def js_click_all(self, selector, by=By.CSS_SELECTOR):
2504
2514
2505
2515
def jquery_click (self , selector , by = By .CSS_SELECTOR ):
2506
2516
""" Clicks an element using jQuery. Different from using pure JS. """
2507
- selector , by = self .__recalculate_selector (selector , by )
2517
+ selector , by = self .__recalculate_selector (selector , by , xp_ok = False )
2508
2518
self .wait_for_element_present (
2509
2519
selector , by = by , timeout = settings .SMALL_TIMEOUT )
2510
2520
if self .is_element_visible (selector , by = by ):
@@ -2517,7 +2527,7 @@ def jquery_click(self, selector, by=By.CSS_SELECTOR):
2517
2527
2518
2528
def jquery_click_all (self , selector , by = By .CSS_SELECTOR ):
2519
2529
""" Clicks all matching elements using jQuery. """
2520
- selector , by = self .__recalculate_selector (selector , by )
2530
+ selector , by = self .__recalculate_selector (selector , by , xp_ok = False )
2521
2531
self .wait_for_element_present (
2522
2532
selector , by = by , timeout = settings .SMALL_TIMEOUT )
2523
2533
if self .is_element_visible (selector , by = by ):
@@ -3137,7 +3147,7 @@ def set_value(self, selector, text, by=By.CSS_SELECTOR, timeout=None):
3137
3147
timeout = settings .LARGE_TIMEOUT
3138
3148
if self .timeout_multiplier and timeout == settings .LARGE_TIMEOUT :
3139
3149
timeout = self .__get_new_timeout (timeout )
3140
- selector , by = self .__recalculate_selector (selector , by )
3150
+ selector , by = self .__recalculate_selector (selector , by , xp_ok = False )
3141
3151
orginal_selector = selector
3142
3152
css_selector = self .convert_to_css_selector (selector , by = by )
3143
3153
self .__demo_mode_highlight_if_active (orginal_selector , by )
@@ -3249,7 +3259,7 @@ def jquery_update_text(self, selector, text, by=By.CSS_SELECTOR,
3249
3259
timeout = settings .LARGE_TIMEOUT
3250
3260
if self .timeout_multiplier and timeout == settings .LARGE_TIMEOUT :
3251
3261
timeout = self .__get_new_timeout (timeout )
3252
- selector , by = self .__recalculate_selector (selector , by )
3262
+ selector , by = self .__recalculate_selector (selector , by , xp_ok = False )
3253
3263
element = self .wait_for_element_visible (
3254
3264
selector , by = by , timeout = timeout )
3255
3265
self .__demo_mode_highlight_if_active (selector , by )
@@ -6063,8 +6073,10 @@ def __click_dropdown_partial_link_text(self, link_text, link_css):
6063
6073
pass
6064
6074
return False
6065
6075
6066
- def __recalculate_selector (self , selector , by ):
6067
- # Use auto-detection to return the correct selector with "by" updated
6076
+ def __recalculate_selector (self , selector , by , xp_ok = True ):
6077
+ """ Use autodetection to return the correct selector with "by" updated.
6078
+ If "xp_ok" is False, don't call convert_css_to_xpath(), which is
6079
+ used to make the ":contains()" selector valid outside JS calls. """
6068
6080
_type = type (selector ) # First make sure the selector is a string
6069
6081
if _type is not str :
6070
6082
msg = 'Expecting a selector of type: "<class \' str\' >" (string)!'
@@ -6081,9 +6093,10 @@ def __recalculate_selector(self, selector, by):
6081
6093
name = page_utils .get_name_from_selector (selector )
6082
6094
selector = '[name="%s"]' % name
6083
6095
by = By .CSS_SELECTOR
6084
- if ":contains(" in selector and by == By .CSS_SELECTOR :
6085
- selector = self .convert_css_to_xpath (selector )
6086
- by = By .XPATH
6096
+ if xp_ok :
6097
+ if ":contains(" in selector and by == By .CSS_SELECTOR :
6098
+ selector = self .convert_css_to_xpath (selector )
6099
+ by = By .XPATH
6087
6100
return (selector , by )
6088
6101
6089
6102
def __looks_like_a_page_url (self , url ):
0 commit comments