Skip to content

Commit 3ef155b

Browse files
committed
Make improvements to JavaScript and jQuery methods
1 parent a6db75e commit 3ef155b

File tree

1 file changed

+48
-28
lines changed

1 file changed

+48
-28
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -243,14 +243,19 @@ def double_click(self, selector, by=By.CSS_SELECTOR, timeout=None):
243243
actions.double_click(element).perform()
244244
except Exception:
245245
css_selector = self.convert_to_css_selector(selector, by=by)
246-
css_selector = re.escape(css_selector)
246+
css_selector = re.escape(css_selector) # Add "\\" to special chars
247247
css_selector = self.__escape_quotes_if_needed(css_selector)
248248
double_click_script = (
249249
"""var targetElement1 = document.querySelector('%s');
250250
var clickEvent1 = document.createEvent('MouseEvents');
251251
clickEvent1.initEvent('dblclick', true, true);
252252
targetElement1.dispatchEvent(clickEvent1);""" % css_selector)
253-
self.execute_script(double_click_script)
253+
if ":contains\\(" not in css_selector:
254+
self.execute_script(double_click_script)
255+
else:
256+
double_click_script = (
257+
"""jQuery('%s').dblclick();""" % css_selector)
258+
self.safe_execute_script(double_click_script)
254259
if settings.WAIT_FOR_RSC_ON_CLICKS:
255260
self.wait_for_ready_state_complete()
256261
if self.demo_mode:
@@ -871,7 +876,7 @@ def set_attribute(self, selector, attribute, value, by=By.CSS_SELECTOR,
871876
value = re.escape(value)
872877
value = self.__escape_quotes_if_needed(value)
873878
css_selector = self.convert_to_css_selector(selector, by=by)
874-
css_selector = re.escape(css_selector)
879+
css_selector = re.escape(css_selector) # Add "\\" to special chars
875880
css_selector = self.__escape_quotes_if_needed(css_selector)
876881
script = ("""document.querySelector('%s').setAttribute('%s','%s');"""
877882
% (css_selector, attribute, value))
@@ -888,7 +893,7 @@ def set_attributes(self, selector, attribute, value, by=By.CSS_SELECTOR):
888893
value = re.escape(value)
889894
value = self.__escape_quotes_if_needed(value)
890895
css_selector = self.convert_to_css_selector(selector, by=by)
891-
css_selector = re.escape(css_selector)
896+
css_selector = re.escape(css_selector) # Add "\\" to special chars
892897
css_selector = self.__escape_quotes_if_needed(css_selector)
893898
script = ("""var $elements = document.querySelectorAll('%s');
894899
var index = 0, length = $elements.length;
@@ -926,7 +931,7 @@ def remove_attribute(self, selector, attribute, by=By.CSS_SELECTOR,
926931
attribute = re.escape(attribute)
927932
attribute = self.__escape_quotes_if_needed(attribute)
928933
css_selector = self.convert_to_css_selector(selector, by=by)
929-
css_selector = re.escape(css_selector)
934+
css_selector = re.escape(css_selector) # Add "\\" to special chars
930935
css_selector = self.__escape_quotes_if_needed(css_selector)
931936
script = ("""document.querySelector('%s').removeAttribute('%s');"""
932937
% (css_selector, attribute))
@@ -939,7 +944,7 @@ def remove_attributes(self, selector, attribute, by=By.CSS_SELECTOR):
939944
attribute = re.escape(attribute)
940945
attribute = self.__escape_quotes_if_needed(attribute)
941946
css_selector = self.convert_to_css_selector(selector, by=by)
942-
css_selector = re.escape(css_selector)
947+
css_selector = re.escape(css_selector) # Add "\\" to special chars
943948
css_selector = self.__escape_quotes_if_needed(css_selector)
944949
script = ("""var $elements = document.querySelectorAll('%s');
945950
var index = 0, length = $elements.length;
@@ -2322,7 +2327,7 @@ def click_xpath(self, xpath):
23222327
self.click(xpath, by=By.XPATH)
23232328

23242329
def js_click(self, selector, by=By.CSS_SELECTOR, all_matches=False):
2325-
""" Clicks an element using pure JS. Does not use jQuery.
2330+
""" Clicks an element using JavaScript.
23262331
If "all_matches" is False, only the first match is clicked. """
23272332
selector, by = self.__recalculate_selector(selector, by)
23282333
if by == By.LINK_TEXT:
@@ -2341,12 +2346,20 @@ def js_click(self, selector, by=By.CSS_SELECTOR, all_matches=False):
23412346
if not self.demo_mode and not self.slow_mode:
23422347
self.__scroll_to_element(element, selector, by)
23432348
css_selector = self.convert_to_css_selector(selector, by=by)
2344-
css_selector = re.escape(css_selector)
2349+
css_selector = re.escape(css_selector) # Add "\\" to special chars
23452350
css_selector = self.__escape_quotes_if_needed(css_selector)
23462351
if not all_matches:
2347-
self.__js_click(selector, by=by) # The real "magic" happens
2352+
if ":contains\\(" not in css_selector:
2353+
self.__js_click(selector, by=by)
2354+
else:
2355+
click_script = """jQuery('%s')[0].click();""" % css_selector
2356+
self.safe_execute_script(click_script)
23482357
else:
2349-
self.__js_click_all(selector, by=by) # The real "magic" happens
2358+
if ":contains\\(" not in css_selector:
2359+
self.__js_click_all(selector, by=by)
2360+
else:
2361+
click_script = """jQuery('%s').click();""" % css_selector
2362+
self.safe_execute_script(click_script)
23502363
self.wait_for_ready_state_complete()
23512364
self.__demo_mode_pause_if_active()
23522365

@@ -2363,7 +2376,7 @@ def jquery_click(self, selector, by=By.CSS_SELECTOR):
23632376
self.__demo_mode_highlight_if_active(selector, by)
23642377
selector = self.convert_to_css_selector(selector, by=by)
23652378
selector = self.__make_css_match_first_element_only(selector)
2366-
click_script = """jQuery('%s')[0].click()""" % selector
2379+
click_script = """jQuery('%s')[0].click();""" % selector
23672380
self.safe_execute_script(click_script)
23682381
self.__demo_mode_pause_if_active()
23692382

@@ -2374,8 +2387,8 @@ def jquery_click_all(self, selector, by=By.CSS_SELECTOR):
23742387
selector, by=by, timeout=settings.SMALL_TIMEOUT)
23752388
if self.is_element_visible(selector, by=by):
23762389
self.__demo_mode_highlight_if_active(selector, by)
2377-
selector = self.convert_to_css_selector(selector, by=by)
2378-
click_script = """jQuery('%s').click()""" % selector
2390+
css_selector = self.convert_to_css_selector(selector, by=by)
2391+
click_script = """jQuery('%s').click();""" % css_selector
23792392
self.safe_execute_script(click_script)
23802393
self.__demo_mode_pause_if_active()
23812394

@@ -2384,51 +2397,51 @@ def hide_element(self, selector, by=By.CSS_SELECTOR):
23842397
selector, by = self.__recalculate_selector(selector, by)
23852398
selector = self.convert_to_css_selector(selector, by=by)
23862399
selector = self.__make_css_match_first_element_only(selector)
2387-
hide_script = """jQuery('%s').hide()""" % selector
2400+
hide_script = """jQuery('%s').hide();""" % selector
23882401
self.safe_execute_script(hide_script)
23892402

23902403
def hide_elements(self, selector, by=By.CSS_SELECTOR):
23912404
""" Hide all elements on the page that match the selector. """
23922405
selector, by = self.__recalculate_selector(selector, by)
23932406
selector = self.convert_to_css_selector(selector, by=by)
2394-
hide_script = """jQuery('%s').hide()""" % selector
2407+
hide_script = """jQuery('%s').hide();""" % selector
23952408
self.safe_execute_script(hide_script)
23962409

23972410
def show_element(self, selector, by=By.CSS_SELECTOR):
23982411
""" Show the first element on the page that matches the selector. """
23992412
selector, by = self.__recalculate_selector(selector, by)
24002413
selector = self.convert_to_css_selector(selector, by=by)
24012414
selector = self.__make_css_match_first_element_only(selector)
2402-
show_script = """jQuery('%s').show(0)""" % selector
2415+
show_script = """jQuery('%s').show(0);""" % selector
24032416
self.safe_execute_script(show_script)
24042417

24052418
def show_elements(self, selector, by=By.CSS_SELECTOR):
24062419
""" Show all elements on the page that match the selector. """
24072420
selector, by = self.__recalculate_selector(selector, by)
24082421
selector = self.convert_to_css_selector(selector, by=by)
2409-
show_script = """jQuery('%s').show(0)""" % selector
2422+
show_script = """jQuery('%s').show(0);""" % selector
24102423
self.safe_execute_script(show_script)
24112424

24122425
def remove_element(self, selector, by=By.CSS_SELECTOR):
24132426
""" Remove the first element on the page that matches the selector. """
24142427
selector, by = self.__recalculate_selector(selector, by)
24152428
selector = self.convert_to_css_selector(selector, by=by)
24162429
selector = self.__make_css_match_first_element_only(selector)
2417-
remove_script = """jQuery('%s').remove()""" % selector
2430+
remove_script = """jQuery('%s').remove();""" % selector
24182431
self.safe_execute_script(remove_script)
24192432

24202433
def remove_elements(self, selector, by=By.CSS_SELECTOR):
24212434
""" Remove all elements on the page that match the selector. """
24222435
selector, by = self.__recalculate_selector(selector, by)
24232436
selector = self.convert_to_css_selector(selector, by=by)
2424-
remove_script = """jQuery('%s').remove()""" % selector
2437+
remove_script = """jQuery('%s').remove();""" % selector
24252438
self.safe_execute_script(remove_script)
24262439

24272440
def ad_block(self):
24282441
""" Block ads that appear on the current web page. """
24292442
from seleniumbase.config import ad_block_list
24302443
for css_selector in ad_block_list.AD_BLOCK_LIST:
2431-
css_selector = re.escape(css_selector)
2444+
css_selector = re.escape(css_selector) # Add "\\" to special chars
24322445
css_selector = self.__escape_quotes_if_needed(css_selector)
24332446
script = ("""var $elements = document.querySelectorAll('%s');
24342447
var index = 0, length = $elements.length;
@@ -2958,11 +2971,18 @@ def set_value(self, selector, text, by=By.CSS_SELECTOR, timeout=None):
29582971
text = str(text)
29592972
value = re.escape(text)
29602973
value = self.__escape_quotes_if_needed(value)
2961-
css_selector = re.escape(css_selector)
2974+
css_selector = re.escape(css_selector) # Add "\\" to special chars
29622975
css_selector = self.__escape_quotes_if_needed(css_selector)
2963-
script = ("""document.querySelector('%s').value='%s';"""
2964-
% (css_selector, value))
2965-
self.execute_script(script)
2976+
if ":contains\\(" not in css_selector:
2977+
script = (
2978+
"""document.querySelector('%s').value='%s';"""
2979+
"" % (css_selector, value))
2980+
self.execute_script(script)
2981+
else:
2982+
script = (
2983+
"""jQuery('%s')[0].value='%s';"""
2984+
"" % (css_selector, value))
2985+
self.safe_execute_script(script)
29662986
if text.endswith('\n'):
29672987
element = self.wait_for_element_present(
29682988
orginal_selector, by=by, timeout=timeout)
@@ -3040,7 +3060,7 @@ def jquery_update_text(self, selector, text, by=By.CSS_SELECTOR,
30403060
selector = self.__escape_quotes_if_needed(selector)
30413061
text = re.escape(text)
30423062
text = self.__escape_quotes_if_needed(text)
3043-
update_text_script = """jQuery('%s').val('%s')""" % (
3063+
update_text_script = """jQuery('%s').val('%s');""" % (
30443064
selector, text)
30453065
self.safe_execute_script(update_text_script)
30463066
if text.endswith('\n'):
@@ -5625,7 +5645,7 @@ def __js_click(self, selector, by=By.CSS_SELECTOR):
56255645
""" Clicks an element using pure JS. Does not use jQuery. """
56265646
selector, by = self.__recalculate_selector(selector, by)
56275647
css_selector = self.convert_to_css_selector(selector, by=by)
5628-
css_selector = re.escape(css_selector)
5648+
css_selector = re.escape(css_selector) # Add "\\" to special chars
56295649
css_selector = self.__escape_quotes_if_needed(css_selector)
56305650
script = ("""var simulateClick = function (elem) {
56315651
var evt = new MouseEvent('click', {
@@ -5644,7 +5664,7 @@ def __js_click_all(self, selector, by=By.CSS_SELECTOR):
56445664
""" Clicks all matching elements using pure JS. (No jQuery) """
56455665
selector, by = self.__recalculate_selector(selector, by)
56465666
css_selector = self.convert_to_css_selector(selector, by=by)
5647-
css_selector = re.escape(css_selector)
5667+
css_selector = re.escape(css_selector) # Add "\\" to special chars
56485668
css_selector = self.__escape_quotes_if_needed(css_selector)
56495669
script = ("""var simulateClick = function (elem) {
56505670
var evt = new MouseEvent('click', {
@@ -5692,7 +5712,7 @@ def __jquery_click(self, selector, by=By.CSS_SELECTOR):
56925712
selector, by=by, timeout=settings.SMALL_TIMEOUT)
56935713
selector = self.convert_to_css_selector(selector, by=by)
56945714
selector = self.__make_css_match_first_element_only(selector)
5695-
click_script = """jQuery('%s')[0].click()""" % selector
5715+
click_script = """jQuery('%s')[0].click();""" % selector
56965716
self.safe_execute_script(click_script)
56975717

56985718
def __get_href_from_link_text(self, link_text, hard_fail=True):

0 commit comments

Comments
 (0)