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
@@ -299,6 +337,35 @@ def add_meta_tag(driver, http_equiv=None, content=None):
299337 driver .execute_script (script_to_add_meta )
300338
301339
340+ def is_jquery_confirm_activated (driver ):
341+ try :
342+ driver .execute_script ("jconfirm" ) # Fails if jq_confirm is not defined
343+ return True
344+ except Exception :
345+ return False
346+
347+
348+ def activate_jquery_confirm (driver ):
349+ jquery_js = constants .JQuery .MIN_JS
350+ jq_confirm_css = constants .JqueryConfirm .MIN_CSS
351+ jq_confirm_js = constants .JqueryConfirm .MIN_JS
352+
353+ if not is_jquery_activated (driver ):
354+ add_js_link (driver , jquery_js )
355+ add_css_link (driver , jq_confirm_css )
356+ add_js_link (driver , jq_confirm_js )
357+
358+ for x in range (int (settings .MINI_TIMEOUT * 10.0 )):
359+ # jQuery-Confirm needs a small amount of time to load & activate.
360+ try :
361+ driver .execute_script ("jconfirm" )
362+ wait_for_ready_state_complete (driver )
363+ wait_for_angularjs (driver )
364+ return
365+ except Exception :
366+ time .sleep (0.1 )
367+
368+
302369def activate_messenger (driver ):
303370 jquery_js = constants .JQuery .MIN_JS
304371 messenger_css = constants .Messenger .MIN_CSS
@@ -395,7 +462,7 @@ def post_message(driver, message, msg_dur, style="info", duration=None):
395462 else :
396463 duration = msg_dur
397464 message = re .escape (message )
398- message = page_utils . escape_quotes_if_needed (message )
465+ message = escape_quotes_if_needed (message )
399466 messenger_script = ('''Messenger().post({message: "%s", type: "%s", '''
400467 '''hideAfter: %s, hideOnNavigate: true});'''
401468 % (message , style , duration ))
@@ -548,3 +615,18 @@ def slow_scroll_to_element(driver, element, browser):
548615 if distance > 430 or distance < - 300 :
549616 # Add small recovery time for long-distance slow-scrolling
550617 time .sleep (0.162 )
618+
619+
620+ def _jq_format (code ):
621+ """
622+ DEPRECATED - Use re.escape() instead, which performs the intended action.
623+ Use before throwing raw code such as 'div[tab="advanced"]' into jQuery.
624+ Selectors with quotes inside of quotes would otherwise break jQuery.
625+ If you just want to escape quotes, there's escape_quotes_if_needed().
626+ This is similar to "json.dumps(value)", but with one less layer of quotes.
627+ """
628+ code = code .replace ('\\ ' , '\\ \\ ' ).replace ('\t ' , '\\ t' ).replace ('\n ' , '\\ n' )
629+ code = code .replace ('\" ' , '\\ \" ' ).replace ('\' ' , '\\ \' ' )
630+ code = code .replace ('\v ' , '\\ v' ).replace ('\a ' , '\\ a' ).replace ('\f ' , '\\ f' )
631+ code = code .replace ('\b ' , '\\ b' ).replace (r'\u' , '\\ u' ).replace ('\r ' , '\\ r' )
632+ return code
0 commit comments