Skip to content

Commit cb06267

Browse files
committed
Refactor js_utils from page_utils
1 parent 9b98ef6 commit cb06267

File tree

5 files changed

+69
-63
lines changed

5 files changed

+69
-63
lines changed

seleniumbase/core/tour_helper.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from seleniumbase.fixtures import constants
1111
from seleniumbase.fixtures import js_utils
1212
from seleniumbase.fixtures import page_actions
13-
from seleniumbase.fixtures import page_utils
1413

1514

1615
def raise_unable_to_load_jquery_exception(driver):
@@ -691,7 +690,7 @@ def export_tour(tour_steps, name=None, filename="my_tour.js"):
691690
bootstrap_tour_js = constants.BootstrapTour.MIN_JS
692691
backdrop_style = style_sheet.bt_backdrop_style
693692
backdrop_style = backdrop_style.replace('\n', '')
694-
backdrop_style = page_utils.escape_quotes_if_needed(backdrop_style)
693+
backdrop_style = js_utils.escape_quotes_if_needed(backdrop_style)
695694
instructions += 'injectJS("%s");' % jquery_js
696695
instructions += '\n\n//////// Resources - Load 2 ////////\n\n'
697696
instructions += 'injectCSS("%s");\n' % bootstrap_tour_css
@@ -703,7 +702,7 @@ def export_tour(tour_steps, name=None, filename="my_tour.js"):
703702
hopscotch_js = constants.Hopscotch.MIN_JS
704703
backdrop_style = style_sheet.hops_backdrop_style
705704
backdrop_style = backdrop_style.replace('\n', '')
706-
backdrop_style = page_utils.escape_quotes_if_needed(backdrop_style)
705+
backdrop_style = js_utils.escape_quotes_if_needed(backdrop_style)
707706
instructions += 'injectCSS("%s");\n' % hopscotch_css
708707
instructions += 'injectStyle("%s");\n' % backdrop_style
709708
instructions += 'injectJS("%s");' % hopscotch_js
@@ -727,7 +726,7 @@ def export_tour(tour_steps, name=None, filename="my_tour.js"):
727726
spinner_css = constants.Messenger.SPINNER_CSS
728727
backdrop_style = style_sheet.sh_backdrop_style
729728
backdrop_style = backdrop_style.replace('\n', '')
730-
backdrop_style = page_utils.escape_quotes_if_needed(backdrop_style)
729+
backdrop_style = js_utils.escape_quotes_if_needed(backdrop_style)
731730
instructions += 'injectCSS("%s");\n' % spinner_css
732731
instructions += 'injectJS("%s");\n' % jquery_js
733732
instructions += 'injectJS("%s");' % tether_js

seleniumbase/fixtures/base_case.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -748,10 +748,10 @@ def activate_jquery(self):
748748
js_utils.activate_jquery(self.driver)
749749

750750
def __are_quotes_escaped(self, string):
751-
return page_utils.are_quotes_escaped(string)
751+
return js_utils.are_quotes_escaped(string)
752752

753753
def __escape_quotes_if_needed(self, string):
754-
return page_utils.escape_quotes_if_needed(string)
754+
return js_utils.escape_quotes_if_needed(string)
755755

756756
def create_tour(self, name=None, theme=None):
757757
""" Creates a tour for a website. By default, the Shepherd Javascript
@@ -1453,7 +1453,7 @@ def ad_block(self):
14531453

14541454
def jq_format(self, code):
14551455
# DEPRECATED - Use re.escape() instead, which does the action you want.
1456-
return page_utils._jq_format(code)
1456+
return js_utils._jq_format(code)
14571457

14581458
def get_domain_url(self, url):
14591459
return page_utils.get_domain_url(url)

seleniumbase/fixtures/js_utils.py

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,14 @@
88
from selenium.common.exceptions import WebDriverException
99
from seleniumbase.config import settings
1010
from seleniumbase.fixtures import constants
11-
from seleniumbase.fixtures import page_utils
11+
12+
13+
def is_jquery_activated(driver):
14+
try:
15+
driver.execute_script("jQuery('html')") # Fails if jq is not defined
16+
return True
17+
except Exception:
18+
return False
1219

1320

1421
def activate_jquery(driver):
@@ -42,6 +49,37 @@ def activate_jquery(driver):
4249
'''directive. ''' % driver.current_url)
4350

4451

52+
def are_quotes_escaped(string):
53+
if (string.count("\\'") != string.count("'") or
54+
string.count('\\"') != string.count('"')):
55+
return True
56+
return False
57+
58+
59+
def escape_quotes_if_needed(string):
60+
"""
61+
re.escape() works differently in Python 3.7.0 than earlier versions:
62+
63+
Python 3.6.5:
64+
>>> import re
65+
>>> re.escape('"')
66+
'\\"'
67+
68+
Python 3.7.0:
69+
>>> import re
70+
>>> re.escape('"')
71+
'"'
72+
73+
SeleniumBase needs quotes to be properly escaped for Javascript calls.
74+
"""
75+
if are_quotes_escaped(string):
76+
if string.count("'") != string.count("\\'"):
77+
string = string.replace("'", "\\'")
78+
if string.count('"') != string.count('\\"'):
79+
string = string.replace('"', '\\"')
80+
return string
81+
82+
4583
def safe_execute_script(driver, script):
4684
""" When executing a script that contains a jQuery command,
4785
it's important that the jQuery library has been loaded first.
@@ -125,7 +163,7 @@ def wait_for_css_query_selector(
125163
for x in range(int(timeout * 10)):
126164
try:
127165
selector = re.escape(selector)
128-
selector = page_utils.escape_quotes_if_needed(selector)
166+
selector = escape_quotes_if_needed(selector)
129167
element = driver.execute_script(
130168
"""return document.querySelector('%s')""" % selector)
131169
if element:
@@ -230,7 +268,7 @@ def add_css_link(driver, css_link):
230268
head.appendChild(link);
231269
}
232270
injectCSS("%s");""")
233-
css_link = page_utils.escape_quotes_if_needed(css_link)
271+
css_link = escape_quotes_if_needed(css_link)
234272
driver.execute_script(script_to_add_css % css_link)
235273

236274

@@ -247,7 +285,7 @@ def add_js_link(driver, js_link):
247285
head.appendChild(script);
248286
}
249287
injectJS("%s");""")
250-
js_link = page_utils.escape_quotes_if_needed(js_link)
288+
js_link = escape_quotes_if_needed(js_link)
251289
driver.execute_script(script_to_add_js % js_link)
252290

253291

@@ -262,7 +300,7 @@ def add_css_style(driver, css_style):
262300
}
263301
injectStyle("%s");""")
264302
css_style = css_style.replace('\n', '')
265-
css_style = page_utils.escape_quotes_if_needed(css_style)
303+
css_style = escape_quotes_if_needed(css_style)
266304
driver.execute_script(add_css_style_script % css_style)
267305

268306

@@ -278,7 +316,7 @@ def add_js_code_from_link(driver, js_link):
278316
'''s.appendChild(document.createTextNode("%s"));'''
279317
'''h.appendChild(s);''')
280318
js_code = js_code.replace('\n', '')
281-
js_code = page_utils.escape_quotes_if_needed(js_code)
319+
js_code = escape_quotes_if_needed(js_code)
282320
driver.execute_script(add_js_code_script % js_code)
283321

284322

@@ -395,7 +433,7 @@ def post_message(driver, message, msg_dur, style="info", duration=None):
395433
else:
396434
duration = msg_dur
397435
message = re.escape(message)
398-
message = page_utils.escape_quotes_if_needed(message)
436+
message = escape_quotes_if_needed(message)
399437
messenger_script = ('''Messenger().post({message: "%s", type: "%s", '''
400438
'''hideAfter: %s, hideOnNavigate: true});'''
401439
% (message, style, duration))
@@ -548,3 +586,18 @@ def slow_scroll_to_element(driver, element, browser):
548586
if distance > 430 or distance < -300:
549587
# Add small recovery time for long-distance slow-scrolling
550588
time.sleep(0.162)
589+
590+
591+
def _jq_format(code):
592+
"""
593+
DEPRECATED - Use re.escape() instead, which performs the intended action.
594+
Use before throwing raw code such as 'div[tab="advanced"]' into jQuery.
595+
Selectors with quotes inside of quotes would otherwise break jQuery.
596+
If you just want to escape quotes, there's escape_quotes_if_needed().
597+
This is similar to "json.dumps(value)", but with one less layer of quotes.
598+
"""
599+
code = code.replace('\\', '\\\\').replace('\t', '\\t').replace('\n', '\\n')
600+
code = code.replace('\"', '\\\"').replace('\'', '\\\'')
601+
code = code.replace('\v', '\\v').replace('\a', '\\a').replace('\f', '\\f')
602+
code = code.replace('\b', '\\b').replace(r'\u', '\\u').replace('\r', '\\r')
603+
return code

seleniumbase/fixtures/page_utils.py

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -83,55 +83,9 @@ def _save_data_as(data, destination_folder, file_name):
8383
out_file.close()
8484

8585

86-
def are_quotes_escaped(string):
87-
if (string.count("\\'") != string.count("'") or
88-
string.count('\\"') != string.count('"')):
89-
return True
90-
return False
91-
92-
93-
def escape_quotes_if_needed(string):
94-
"""
95-
re.escape() works differently in Python 3.7.0 than earlier versions:
96-
97-
Python 3.6.5:
98-
>>> import re
99-
>>> re.escape('"')
100-
'\\"'
101-
102-
Python 3.7.0:
103-
>>> import re
104-
>>> re.escape('"')
105-
'"'
106-
107-
SeleniumBase needs quotes to be properly escaped for Javascript calls.
108-
"""
109-
if are_quotes_escaped(string):
110-
if string.count("'") != string.count("\\'"):
111-
string = string.replace("'", "\\'")
112-
if string.count('"') != string.count('\\"'):
113-
string = string.replace('"', '\\"')
114-
return string
115-
116-
11786
def make_css_match_first_element_only(selector):
11887
# Only get the first match
11988
last_syllable = selector.split(' ')[-1]
12089
if ':' not in last_syllable and ':contains' not in selector:
12190
selector += ':first'
12291
return selector
123-
124-
125-
def _jq_format(code):
126-
"""
127-
DEPRECATED - Use re.escape() instead, which performs the intended action.
128-
Use before throwing raw code such as 'div[tab="advanced"]' into jQuery.
129-
Selectors with quotes inside of quotes would otherwise break jQuery.
130-
If you just want to escape quotes, there's escape_quotes_if_needed().
131-
This is similar to "json.dumps(value)", but with one less layer of quotes.
132-
"""
133-
code = code.replace('\\', '\\\\').replace('\t', '\\t').replace('\n', '\\n')
134-
code = code.replace('\"', '\\\"').replace('\'', '\\\'')
135-
code = code.replace('\v', '\\v').replace('\a', '\\a').replace('\f', '\\f')
136-
code = code.replace('\b', '\\b').replace(r'\u', '\\u').replace('\r', '\\r')
137-
return code

seleniumbase/utilities/selenium_ide/convert_ide.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import codecs
1818
import re
1919
import sys
20-
from seleniumbase.fixtures import page_utils
20+
from seleniumbase.fixtures import js_utils
2121

2222

2323
def main():
@@ -587,7 +587,7 @@ def main():
587587
# quote_type = data.group(1)
588588
selector = data.group(2)
589589
selector = re.escape(selector)
590-
selector = page_utils.escape_quotes_if_needed(selector)
590+
selector = js_utils.escape_quotes_if_needed(selector)
591591
if int(line_num) < num_lines - 1:
592592
regex_string = (r'''^\s*self.click\(["|']''' +
593593
selector + r'''["|']\)\s*$''')
@@ -615,7 +615,7 @@ def main():
615615
# quote_type = data.group(1)
616616
link_text = data.group(2)
617617
link_text = re.escape(link_text)
618-
link_text = page_utils.escape_quotes_if_needed(link_text)
618+
link_text = js_utils.escape_quotes_if_needed(link_text)
619619
if int(line_num) < num_lines - 2:
620620
regex_string = (r'''^\s*self.click\(["|']link=''' +
621621
link_text + r'''["|']\)\s*$''')

0 commit comments

Comments
 (0)