1010from seleniumbase .fixtures import constants
1111
1212
13+ def wait_for_ready_state_complete (driver , timeout = settings .EXTREME_TIMEOUT ):
14+ """
15+ The DOM (Document Object Model) has a property called "readyState".
16+ When the value of this becomes "complete", page resources are considered
17+ fully loaded (although AJAX and other loads might still be happening).
18+ This method will wait until document.readyState == "complete".
19+ """
20+
21+ start_ms = time .time () * 1000.0
22+ stop_ms = start_ms + (timeout * 1000.0 )
23+ for x in range (int (timeout * 10 )):
24+ try :
25+ ready_state = driver .execute_script ("return document.readyState" )
26+ except WebDriverException :
27+ # Bug fix for: [Permission denied to access property "document"]
28+ time .sleep (0.03 )
29+ return True
30+ if ready_state == u'complete' :
31+ time .sleep (0.01 ) # Better be sure everything is done loading
32+ return True
33+ else :
34+ now_ms = time .time () * 1000.0
35+ if now_ms >= stop_ms :
36+ break
37+ time .sleep (0.1 )
38+ raise Exception (
39+ "Page elements never fully loaded after %s seconds!" % timeout )
40+
41+
42+ def execute_async_script (driver , script , timeout = settings .EXTREME_TIMEOUT ):
43+ driver .set_script_timeout (timeout )
44+ return driver .execute_async_script (script )
45+
46+
47+ def wait_for_angularjs (driver , timeout = settings .LARGE_TIMEOUT , ** kwargs ):
48+ if not settings .WAIT_FOR_ANGULARJS :
49+ return
50+
51+ NG_WRAPPER = '%(prefix)s' \
52+ 'var $elm=document.querySelector(' \
53+ '\' [data-ng-app],[ng-app],.ng-scope\' )||document;' \
54+ 'if(window.angular && angular.getTestability){' \
55+ 'angular.getTestability($elm).whenStable(%(handler)s)' \
56+ '}else{' \
57+ 'var $inj;try{$inj=angular.element($elm).injector()||' \
58+ 'angular.injector([\' ng\' ])}catch(ex){' \
59+ '$inj=angular.injector([\' ng\' ])};$inj.get=$inj.get||' \
60+ '$inj;$inj.get(\' $browser\' ).' \
61+ 'notifyWhenNoOutstandingRequests(%(handler)s)}' \
62+ '%(suffix)s'
63+ def_pre = 'var cb=arguments[arguments.length-1];if(window.angular){'
64+ prefix = kwargs .pop ('prefix' , def_pre )
65+ handler = kwargs .pop ('handler' , 'function(){cb(true)}' )
66+ suffix = kwargs .pop ('suffix' , '}else{cb(false)}' )
67+ script = NG_WRAPPER % {'prefix' : prefix ,
68+ 'handler' : handler ,
69+ 'suffix' : suffix }
70+ try :
71+ execute_async_script (driver , script , timeout = timeout )
72+ except Exception :
73+ time .sleep (0.05 )
74+
75+
1376def is_jquery_activated (driver ):
1477 try :
1578 driver .execute_script ("jQuery('html')" ) # Fails if jq is not defined
@@ -18,6 +81,22 @@ def is_jquery_activated(driver):
1881 return False
1982
2083
84+ def wait_for_jquery_active (driver , timeout = None ):
85+ if not timeout :
86+ timeout = int (settings .MINI_TIMEOUT * 10.0 )
87+ else :
88+ timeout = int (timeout * 10.0 )
89+ for x in range (timeout ):
90+ # jQuery needs a small amount of time to activate.
91+ try :
92+ driver .execute_script ("jQuery('html')" )
93+ wait_for_ready_state_complete (driver )
94+ wait_for_angularjs (driver )
95+ return
96+ except Exception :
97+ time .sleep (0.1 )
98+
99+
21100def activate_jquery (driver ):
22101 """ If "jQuery is not defined", use this method to activate it for use.
23102 This happens because jQuery is not always defined on web sites. """
@@ -92,69 +171,6 @@ def safe_execute_script(driver, script):
92171 driver .execute_script (script )
93172
94173
95- def wait_for_ready_state_complete (driver , timeout = settings .EXTREME_TIMEOUT ):
96- """
97- The DOM (Document Object Model) has a property called "readyState".
98- When the value of this becomes "complete", page resources are considered
99- fully loaded (although AJAX and other loads might still be happening).
100- This method will wait until document.readyState == "complete".
101- """
102-
103- start_ms = time .time () * 1000.0
104- stop_ms = start_ms + (timeout * 1000.0 )
105- for x in range (int (timeout * 10 )):
106- try :
107- ready_state = driver .execute_script ("return document.readyState" )
108- except WebDriverException :
109- # Bug fix for: [Permission denied to access property "document"]
110- time .sleep (0.03 )
111- return True
112- if ready_state == u'complete' :
113- time .sleep (0.01 ) # Better be sure everything is done loading
114- return True
115- else :
116- now_ms = time .time () * 1000.0
117- if now_ms >= stop_ms :
118- break
119- time .sleep (0.1 )
120- raise Exception (
121- "Page elements never fully loaded after %s seconds!" % timeout )
122-
123-
124- def execute_async_script (driver , script , timeout = settings .EXTREME_TIMEOUT ):
125- driver .set_script_timeout (timeout )
126- return driver .execute_async_script (script )
127-
128-
129- def wait_for_angularjs (driver , timeout = settings .LARGE_TIMEOUT , ** kwargs ):
130- if not settings .WAIT_FOR_ANGULARJS :
131- return
132-
133- NG_WRAPPER = '%(prefix)s' \
134- 'var $elm=document.querySelector(' \
135- '\' [data-ng-app],[ng-app],.ng-scope\' )||document;' \
136- 'if(window.angular && angular.getTestability){' \
137- 'angular.getTestability($elm).whenStable(%(handler)s)' \
138- '}else{' \
139- 'var $inj;try{$inj=angular.element($elm).injector()||' \
140- 'angular.injector([\' ng\' ])}catch(ex){' \
141- '$inj=angular.injector([\' ng\' ])};$inj.get=$inj.get||' \
142- '$inj;$inj.get(\' $browser\' ).' \
143- 'notifyWhenNoOutstandingRequests(%(handler)s)}' \
144- '%(suffix)s'
145- def_pre = 'var cb=arguments[arguments.length-1];if(window.angular){'
146- prefix = kwargs .pop ('prefix' , def_pre )
147- handler = kwargs .pop ('handler' , 'function(){cb(true)}' )
148- suffix = kwargs .pop ('suffix' , '}else{cb(false)}' )
149- script = NG_WRAPPER % {'prefix' : prefix ,
150- 'handler' : handler ,
151- 'suffix' : suffix }
152- try :
153- execute_async_script (driver , script , timeout = timeout )
154- except Exception :
155- time .sleep (0.05 )
156-
157-
158174def wait_for_css_query_selector (
159175 driver , selector , timeout = settings .SMALL_TIMEOUT ):
160176 element = None
@@ -352,10 +368,11 @@ def activate_jquery_confirm(driver):
352368
353369 if not is_jquery_activated (driver ):
354370 add_js_link (driver , jquery_js )
371+ wait_for_jquery_active (driver , timeout = 0.6 )
355372 add_css_link (driver , jq_confirm_css )
356373 add_js_link (driver , jq_confirm_js )
357374
358- for x in range (int ( settings . MINI_TIMEOUT * 10.0 ) ):
375+ for x in range (7 ):
359376 # jQuery-Confirm needs a small amount of time to load & activate.
360377 try :
361378 driver .execute_script ("jconfirm" )
0 commit comments