Skip to content

Commit 8fde20a

Browse files
committed
Improve Demo Mode for selectors that use ":contains()"
1 parent 8d525f0 commit 8fde20a

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ def click(self, selector, by=By.CSS_SELECTOR, timeout=None, delay=0):
134134
timeout = settings.SMALL_TIMEOUT
135135
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
136136
timeout = self.__get_new_timeout(timeout)
137+
original_selector = selector
138+
original_by = by
137139
selector, by = self.__recalculate_selector(selector, by)
138140
if page_utils.is_link_text_selector(selector) or by == By.LINK_TEXT:
139141
if not self.is_link_text_visible(selector):
@@ -148,7 +150,7 @@ def click(self, selector, by=By.CSS_SELECTOR, timeout=None, delay=0):
148150
return
149151
element = page_actions.wait_for_element_visible(
150152
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)
152154
if not self.demo_mode and not self.slow_mode:
153155
self.__scroll_to_element(element, selector, by)
154156
pre_action_url = self.driver.current_url
@@ -226,10 +228,12 @@ def double_click(self, selector, by=By.CSS_SELECTOR, timeout=None):
226228
timeout = settings.SMALL_TIMEOUT
227229
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
228230
timeout = self.__get_new_timeout(timeout)
231+
original_selector = selector
232+
original_by = by
229233
selector, by = self.__recalculate_selector(selector, by)
230234
element = page_actions.wait_for_element_visible(
231235
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)
233237
if not self.demo_mode and not self.slow_mode:
234238
self.__scroll_to_element(element, selector, by)
235239
pre_action_url = self.driver.current_url
@@ -1289,13 +1293,15 @@ def switch_to_frame_of_element(self, selector, by=By.CSS_SELECTOR):
12891293
"element {%s}!" % selector)
12901294

12911295
def hover_on_element(self, selector, by=By.CSS_SELECTOR):
1296+
original_selector = selector
1297+
original_by = by
12921298
selector, by = self.__recalculate_selector(selector, by)
12931299
if page_utils.is_xpath_selector(selector):
12941300
selector = self.convert_to_css_selector(selector, By.XPATH)
12951301
by = By.CSS_SELECTOR
12961302
self.wait_for_element_visible(
12971303
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)
12991305
self.scroll_to(selector, by=by)
13001306
time.sleep(0.05) # Settle down from scrolling before hovering
13011307
if self.browser != "chrome":
@@ -1339,6 +1345,8 @@ def hover_and_click(self, hover_selector, click_selector,
13391345
timeout = settings.SMALL_TIMEOUT
13401346
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
13411347
timeout = self.__get_new_timeout(timeout)
1348+
original_selector = hover_selector
1349+
original_by = hover_by
13421350
hover_selector, hover_by = self.__recalculate_selector(
13431351
hover_selector, hover_by)
13441352
hover_selector = self.convert_to_css_selector(
@@ -1348,7 +1356,7 @@ def hover_and_click(self, hover_selector, click_selector,
13481356
click_selector, click_by)
13491357
dropdown_element = self.wait_for_element_visible(
13501358
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)
13521360
self.scroll_to(hover_selector, by=hover_by)
13531361
pre_action_url = self.driver.current_url
13541362
outdated_driver = False
@@ -1400,6 +1408,8 @@ def hover_and_double_click(self, hover_selector, click_selector,
14001408
timeout = settings.SMALL_TIMEOUT
14011409
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
14021410
timeout = self.__get_new_timeout(timeout)
1411+
original_selector = hover_selector
1412+
original_by = hover_by
14031413
hover_selector, hover_by = self.__recalculate_selector(
14041414
hover_selector, hover_by)
14051415
hover_selector = self.convert_to_css_selector(
@@ -1409,7 +1419,7 @@ def hover_and_double_click(self, hover_selector, click_selector,
14091419
click_selector, click_by)
14101420
dropdown_element = self.wait_for_element_visible(
14111421
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)
14131423
self.scroll_to(hover_selector, by=hover_by)
14141424
pre_action_url = self.driver.current_url
14151425
outdated_driver = False
@@ -2239,7 +2249,7 @@ def highlight(self, selector, by=By.CSS_SELECTOR,
22392249
(Default: 4. Each loop lasts for about 0.18s)
22402250
scroll - the option to scroll to the element first (Default: True)
22412251
"""
2242-
selector, by = self.__recalculate_selector(selector, by)
2252+
selector, by = self.__recalculate_selector(selector, by, xp_ok=False)
22432253
element = self.wait_for_element_visible(
22442254
selector, by=by, timeout=settings.SMALL_TIMEOUT)
22452255
if not loops:
@@ -2464,7 +2474,7 @@ def click_xpath(self, xpath):
24642474
def js_click(self, selector, by=By.CSS_SELECTOR, all_matches=False):
24652475
""" Clicks an element using JavaScript.
24662476
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)
24682478
if by == By.LINK_TEXT:
24692479
message = (
24702480
"Pure JavaScript doesn't support clicking by Link Text. "
@@ -2504,7 +2514,7 @@ def js_click_all(self, selector, by=By.CSS_SELECTOR):
25042514

25052515
def jquery_click(self, selector, by=By.CSS_SELECTOR):
25062516
""" 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)
25082518
self.wait_for_element_present(
25092519
selector, by=by, timeout=settings.SMALL_TIMEOUT)
25102520
if self.is_element_visible(selector, by=by):
@@ -2517,7 +2527,7 @@ def jquery_click(self, selector, by=By.CSS_SELECTOR):
25172527

25182528
def jquery_click_all(self, selector, by=By.CSS_SELECTOR):
25192529
""" 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)
25212531
self.wait_for_element_present(
25222532
selector, by=by, timeout=settings.SMALL_TIMEOUT)
25232533
if self.is_element_visible(selector, by=by):
@@ -3137,7 +3147,7 @@ def set_value(self, selector, text, by=By.CSS_SELECTOR, timeout=None):
31373147
timeout = settings.LARGE_TIMEOUT
31383148
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
31393149
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)
31413151
orginal_selector = selector
31423152
css_selector = self.convert_to_css_selector(selector, by=by)
31433153
self.__demo_mode_highlight_if_active(orginal_selector, by)
@@ -3249,7 +3259,7 @@ def jquery_update_text(self, selector, text, by=By.CSS_SELECTOR,
32493259
timeout = settings.LARGE_TIMEOUT
32503260
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
32513261
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)
32533263
element = self.wait_for_element_visible(
32543264
selector, by=by, timeout=timeout)
32553265
self.__demo_mode_highlight_if_active(selector, by)
@@ -6063,8 +6073,10 @@ def __click_dropdown_partial_link_text(self, link_text, link_css):
60636073
pass
60646074
return False
60656075

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. """
60686080
_type = type(selector) # First make sure the selector is a string
60696081
if _type is not str:
60706082
msg = 'Expecting a selector of type: "<class \'str\'>" (string)!'
@@ -6081,9 +6093,10 @@ def __recalculate_selector(self, selector, by):
60816093
name = page_utils.get_name_from_selector(selector)
60826094
selector = '[name="%s"]' % name
60836095
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
60876100
return (selector, by)
60886101

60896102
def __looks_like_a_page_url(self, url):

0 commit comments

Comments
 (0)