88from selenium .common .exceptions import WebDriverException
99from seleniumbase .config import settings
1010from 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
1421def 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+
4583def 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
0 commit comments