8
8
from selenium .common .exceptions import WebDriverException
9
9
from seleniumbase .config import settings
10
10
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
12
19
13
20
14
21
def activate_jquery (driver ):
@@ -42,6 +49,37 @@ def activate_jquery(driver):
42
49
'''directive. ''' % driver .current_url )
43
50
44
51
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
+
45
83
def safe_execute_script (driver , script ):
46
84
""" When executing a script that contains a jQuery command,
47
85
it's important that the jQuery library has been loaded first.
@@ -125,7 +163,7 @@ def wait_for_css_query_selector(
125
163
for x in range (int (timeout * 10 )):
126
164
try :
127
165
selector = re .escape (selector )
128
- selector = page_utils . escape_quotes_if_needed (selector )
166
+ selector = escape_quotes_if_needed (selector )
129
167
element = driver .execute_script (
130
168
"""return document.querySelector('%s')""" % selector )
131
169
if element :
@@ -230,7 +268,7 @@ def add_css_link(driver, css_link):
230
268
head.appendChild(link);
231
269
}
232
270
injectCSS("%s");""" )
233
- css_link = page_utils . escape_quotes_if_needed (css_link )
271
+ css_link = escape_quotes_if_needed (css_link )
234
272
driver .execute_script (script_to_add_css % css_link )
235
273
236
274
@@ -247,7 +285,7 @@ def add_js_link(driver, js_link):
247
285
head.appendChild(script);
248
286
}
249
287
injectJS("%s");""" )
250
- js_link = page_utils . escape_quotes_if_needed (js_link )
288
+ js_link = escape_quotes_if_needed (js_link )
251
289
driver .execute_script (script_to_add_js % js_link )
252
290
253
291
@@ -262,7 +300,7 @@ def add_css_style(driver, css_style):
262
300
}
263
301
injectStyle("%s");""" )
264
302
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 )
266
304
driver .execute_script (add_css_style_script % css_style )
267
305
268
306
@@ -278,7 +316,7 @@ def add_js_code_from_link(driver, js_link):
278
316
'''s.appendChild(document.createTextNode("%s"));'''
279
317
'''h.appendChild(s);''' )
280
318
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 )
282
320
driver .execute_script (add_js_code_script % js_code )
283
321
284
322
@@ -299,6 +337,35 @@ def add_meta_tag(driver, http_equiv=None, content=None):
299
337
driver .execute_script (script_to_add_meta )
300
338
301
339
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
+
302
369
def activate_messenger (driver ):
303
370
jquery_js = constants .JQuery .MIN_JS
304
371
messenger_css = constants .Messenger .MIN_CSS
@@ -395,7 +462,7 @@ def post_message(driver, message, msg_dur, style="info", duration=None):
395
462
else :
396
463
duration = msg_dur
397
464
message = re .escape (message )
398
- message = page_utils . escape_quotes_if_needed (message )
465
+ message = escape_quotes_if_needed (message )
399
466
messenger_script = ('''Messenger().post({message: "%s", type: "%s", '''
400
467
'''hideAfter: %s, hideOnNavigate: true});'''
401
468
% (message , style , duration ))
@@ -548,3 +615,18 @@ def slow_scroll_to_element(driver, element, browser):
548
615
if distance > 430 or distance < - 300 :
549
616
# Add small recovery time for long-distance slow-scrolling
550
617
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