angular_webdriver 0.0.7 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.gitmodules +3 -0
- data/.rspec +2 -0
- data/.travis.yml +32 -0
- data/Gemfile +2 -0
- data/Thorfile +33 -1
- data/angular_webdriver.gemspec +10 -3
- data/docs/overview.md +101 -0
- data/docs/sync.md +53 -0
- data/lib/angular_webdriver/protractor/by.rb +331 -0
- data/lib/angular_webdriver/protractor/by_repeater_inner.rb +106 -0
- data/lib/angular_webdriver/protractor/client_side_scripts.rb +1035 -0
- data/lib/angular_webdriver/protractor/protractor.rb +396 -77
- data/lib/angular_webdriver/protractor/protractor_element.rb +33 -0
- data/lib/angular_webdriver/protractor/rspec_helpers.rb +19 -0
- data/lib/angular_webdriver/protractor/watir_patch.rb +209 -0
- data/lib/angular_webdriver/protractor/webdriver_patch.rb +246 -0
- data/lib/angular_webdriver/version.rb +2 -2
- data/lib/angular_webdriver.rb +14 -1
- data/{LICENSE → license/angular_webdriver/LICENSE.txt} +0 -0
- data/{lib/angular_webdriver → license}/protractor/LICENSE.txt +0 -0
- data/{lib/angular_webdriver/protractor/get_url_trace.rb → notes/bootstrap_notes.md} +13 -0
- data/notes/element_by_id/element_by_id_sync_off.txt +12 -0
- data/notes/element_by_id/element_by_id_sync_on.txt +74 -0
- data/notes/element_chaining_debug.txt +94 -0
- data/notes/evaluate/js_evaluate_sync_on.txt +60 -0
- data/notes/evaluate/ruby_evaluate_sync_on.txt +35 -0
- data/notes/get_title/browser_get_title_sync_off.txt +11 -0
- data/notes/get_title/browser_get_title_sync_on.txt +54 -0
- data/notes/phantomjs.md +23 -0
- data/notes/protractor_cli_bugs.txt +39 -0
- data/notes/protractor_get/protractor_get.rb +102 -0
- data/notes/protractor_get/protractor_get_website_sync_off.txt +11 -0
- data/notes/protractor_get/protractor_get_website_sync_on.txt +86 -0
- data/notes/repeater/findAllRepeaterRows_annotated.txt +150 -0
- data/notes/repeater/findAllRepeaterRows_raw.txt +145 -0
- data/notes/repeater/findRepeaterColumn_annotated.txt +317 -0
- data/notes/repeater/findRepeaterColumn_raw.txt +310 -0
- data/notes/repeater/findRepeaterElement_annotated.txt +152 -0
- data/notes/repeater/findRepeaterElement_raw.txt +146 -0
- data/notes/repeater/findRepeaterRows_annotated.txt +156 -0
- data/notes/repeater/findRepeaterRows_raw.txt +152 -0
- data/notes/sync_after.md +46 -0
- data/notes/sync_notes.md +137 -0
- data/notes/synchronize_spec/status_gettext.txt +121 -0
- data/notes/synchronize_spec/status_gettext_x3.txt +451 -0
- data/notes/synchronize_spec/synchronize_spec.js.txt +74 -0
- data/notes/synchronize_spec/watir_gettext.txt +73 -0
- data/readme.md +52 -12
- data/release_notes.md +127 -0
- data/selenium_server/lib/logs.rb +50 -0
- data/selenium_server/lib/selenium_server.rb +21 -0
- data/selenium_server/readme.md +3 -0
- data/selenium_server/spec/logs_spec.rb +18 -0
- data/selenium_server/spec/nodejs_sync_spec_waithttp_annotated.txt +54 -0
- data/selenium_server/spec/nodejs_sync_spec_waithttp_raw.txt +367 -0
- data/selenium_server/spec/nodejs_sync_spec_waithttp_raw_processed.txt +43 -0
- data/selenium_server/spec/ruby_sync_spec_waithttp_annotated.txt +59 -0
- data/selenium_server/spec/ruby_sync_spec_waithttp_raw.txt +267 -0
- data/selenium_server/spec/ruby_sync_spec_waithttp_raw_processed.txt +39 -0
- data/selenium_server/spec/spec_helper.rb +6 -0
- data/selenium_server/spec/status_gettext_x3.txt +429 -0
- data/selenium_server/spec/status_gettext_x3_annotated.txt +86 -0
- metadata +91 -18
- data/lib/angular_webdriver/protractor/clientSideScripts.json +0 -19
- data/lib/angular_webdriver/protractor/clientsidescripts.js +0 -671
- data/lib/angular_webdriver/protractor/scripts.rb +0 -7
- data/lib/angular_webdriver/protractor/scripts_to_json.js +0 -11
- data/spec/protractor_spec.rb +0 -40
- data/spec/spec_helper.rb +0 -5
@@ -0,0 +1,429 @@
|
|
1
|
+
15:51:00.940 INFO [1] org.openqa.grid.selenium.GridLauncher - Launching a standalone server
|
2
|
+
15:51:01.018 INFO [1] org.openqa.selenium.server.SeleniumServer - Writing debug logs to angular_sync.txt
|
3
|
+
15:51:01.018 INFO [1] org.openqa.selenium.server.SeleniumServer - Java: Oracle Corporation 25.25-b02
|
4
|
+
15:51:01.018 INFO [1] org.openqa.selenium.server.SeleniumServer - OS: Mac OS X 10.10.3 x86_64
|
5
|
+
15:51:01.047 INFO [1] org.openqa.selenium.server.SeleniumServer - v2.45.0, with Core v2.45.0. Built from revision 5017cb8
|
6
|
+
15:51:01.179 INFO [1] org.openqa.selenium.remote.server.DefaultDriverSessions - Default driver org.openqa.selenium.ie.InternetExplorerDriver registration is skipped: registration capabilities Capabilities [{ensureCleanSession=true, browserName=internet explorer, version=, platform=WINDOWS}] does not match with current platform: MAC
|
7
|
+
15:51:01.283 INFO [1] org.openqa.selenium.server.SeleniumServer - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
|
8
|
+
15:51:01.284 INFO [1] org.openqa.jetty.http.HttpServer - Version Jetty/5.1.x
|
9
|
+
15:51:01.286 INFO [1] org.openqa.jetty.util.Container - Started HttpContext[/selenium-server,/selenium-server]
|
10
|
+
15:51:01.329 INFO [1] org.openqa.jetty.util.Container - Started org.openqa.jetty.jetty.servlet.ServletHandler@5ba23b66
|
11
|
+
15:51:01.329 INFO [1] org.openqa.jetty.util.Container - Started HttpContext[/wd,/wd]
|
12
|
+
15:51:01.329 INFO [1] org.openqa.jetty.util.Container - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
|
13
|
+
15:51:01.329 INFO [1] org.openqa.jetty.util.Container - Started HttpContext[/,/]
|
14
|
+
15:51:01.340 INFO [1] org.openqa.jetty.http.SocketListener - Started SocketListener on 0.0.0.0:4444
|
15
|
+
15:51:01.340 INFO [1] org.openqa.jetty.util.Container - Started org.openqa.jetty.jetty.Server@7e6cbb7a
|
16
|
+
15:51:34.766 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [new session: Capabilities [{count=1, browserName=firefox, version=ANY}]])
|
17
|
+
15:51:34.787 INFO [21] org.openqa.selenium.remote.server.DefaultDriverProvider - Creating a new session for Capabilities [{count=1, browserName=firefox, version=ANY}]
|
18
|
+
15:51:42.070 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [new session: Capabilities [{count=1, browserName=firefox, version=ANY}]]
|
19
|
+
15:51:42.116 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [set script timeoutt: 11000])
|
20
|
+
15:51:42.143 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [set script timeoutt: 11000]
|
21
|
+
15:51:42.312 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [get: data:text/html,<html></html>])
|
22
|
+
15:51:42.388 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [get: data:text/html,<html></html>]
|
23
|
+
15:51:42.401 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute script: window.name = "NG_DEFER_BOOTSTRAP!" + window.name;window.location.replace("http://localhost:8081/index.html#/async");, []])
|
24
|
+
15:51:42.464 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute script: window.name = "NG_DEFER_BOOTSTRAP!" + window.name;window.location.replace("http://localhost:8081/index.html#/async");, []]
|
25
|
+
15:51:42.486 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute script: return window.location.href;, []])
|
26
|
+
15:51:42.685 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute script: return window.location.href;, []]
|
27
|
+
15:51:42.720 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute async script: try { return (function (attempts, asyncCallback) {
|
28
|
+
var callback = function(args) {
|
29
|
+
setTimeout(function() {
|
30
|
+
asyncCallback(args);
|
31
|
+
}, 0);
|
32
|
+
};
|
33
|
+
var check = function(n) {
|
34
|
+
try {
|
35
|
+
if (window.angular && window.angular.resumeBootstrap) {
|
36
|
+
callback([true, null]);
|
37
|
+
} else if (n < 1) {
|
38
|
+
if (window.angular) {
|
39
|
+
callback([false, 'angular never provided resumeBootstrap']);
|
40
|
+
} else {
|
41
|
+
callback([false, 'retries looking for angular exceeded']);
|
42
|
+
}
|
43
|
+
} else {
|
44
|
+
window.setTimeout(function() {check(n - 1);}, 1000);
|
45
|
+
}
|
46
|
+
} catch (e) {
|
47
|
+
callback([false, e]);
|
48
|
+
}
|
49
|
+
};
|
50
|
+
check(attempts);
|
51
|
+
}).apply(this, arguments); }
|
52
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [10]])
|
53
|
+
15:51:42.812 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute async script: try { return (function (attempts, asyncCallback) {
|
54
|
+
var callback = function(args) {
|
55
|
+
setTimeout(function() {
|
56
|
+
asyncCallback(args);
|
57
|
+
}, 0);
|
58
|
+
};
|
59
|
+
var check = function(n) {
|
60
|
+
try {
|
61
|
+
if (window.angular && window.angular.resumeBootstrap) {
|
62
|
+
callback([true, null]);
|
63
|
+
} else if (n < 1) {
|
64
|
+
if (window.angular) {
|
65
|
+
callback([false, 'angular never provided resumeBootstrap']);
|
66
|
+
} else {
|
67
|
+
callback([false, 'retries looking for angular exceeded']);
|
68
|
+
}
|
69
|
+
} else {
|
70
|
+
window.setTimeout(function() {check(n - 1);}, 1000);
|
71
|
+
}
|
72
|
+
} catch (e) {
|
73
|
+
callback([false, e]);
|
74
|
+
}
|
75
|
+
};
|
76
|
+
check(attempts);
|
77
|
+
}).apply(this, arguments); }
|
78
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [10]]
|
79
|
+
15:51:42.823 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute script: return (function () {
|
80
|
+
angular.module('protractorBaseModule_', []).
|
81
|
+
config(['$compileProvider', function($compileProvider) {
|
82
|
+
if ($compileProvider.debugInfoEnabled) {
|
83
|
+
$compileProvider.debugInfoEnabled(true);
|
84
|
+
}
|
85
|
+
}]);
|
86
|
+
}).apply(null, arguments);, []])
|
87
|
+
15:51:42.872 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute script: return (function () {
|
88
|
+
angular.module('protractorBaseModule_', []).
|
89
|
+
config(['$compileProvider', function($compileProvider) {
|
90
|
+
if ($compileProvider.debugInfoEnabled) {
|
91
|
+
$compileProvider.debugInfoEnabled(true);
|
92
|
+
}
|
93
|
+
}]);
|
94
|
+
}).apply(null, arguments);, []]
|
95
|
+
15:51:42.883 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute script: angular.resumeBootstrap(arguments[0]);, [[protractorBaseModule_]]])
|
96
|
+
15:51:42.977 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute script: angular.resumeBootstrap(arguments[0]);, [[protractorBaseModule_]]]
|
97
|
+
15:51:43.066 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute async script: try { return (function (rootSelector, callback) {
|
98
|
+
var el = document.querySelector(rootSelector);
|
99
|
+
|
100
|
+
try {
|
101
|
+
if (!window.angular) {
|
102
|
+
throw new Error('angular could not be found on the window');
|
103
|
+
}
|
104
|
+
if (angular.getTestability) {
|
105
|
+
angular.getTestability(el).whenStable(callback);
|
106
|
+
} else {
|
107
|
+
if (!angular.element(el).injector()) {
|
108
|
+
throw new Error('root element (' + rootSelector + ') has no injector.' +
|
109
|
+
' this may mean it is not inside ng-app.');
|
110
|
+
}
|
111
|
+
angular.element(el).injector().get('$browser').
|
112
|
+
notifyWhenNoOutstandingRequests(callback);
|
113
|
+
}
|
114
|
+
} catch (err) {
|
115
|
+
callback(err.message);
|
116
|
+
}
|
117
|
+
}).apply(this, arguments); }
|
118
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]])
|
119
|
+
15:51:43.121 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute async script: try { return (function (rootSelector, callback) {
|
120
|
+
var el = document.querySelector(rootSelector);
|
121
|
+
|
122
|
+
try {
|
123
|
+
if (!window.angular) {
|
124
|
+
throw new Error('angular could not be found on the window');
|
125
|
+
}
|
126
|
+
if (angular.getTestability) {
|
127
|
+
angular.getTestability(el).whenStable(callback);
|
128
|
+
} else {
|
129
|
+
if (!angular.element(el).injector()) {
|
130
|
+
throw new Error('root element (' + rootSelector + ') has no injector.' +
|
131
|
+
' this may mean it is not inside ng-app.');
|
132
|
+
}
|
133
|
+
angular.element(el).injector().get('$browser').
|
134
|
+
notifyWhenNoOutstandingRequests(callback);
|
135
|
+
}
|
136
|
+
} catch (err) {
|
137
|
+
callback(err.message);
|
138
|
+
}
|
139
|
+
}).apply(this, arguments); }
|
140
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]]
|
141
|
+
15:51:43.135 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute script: try { return (function (binding, exactMatch, using, rootSelector) {
|
142
|
+
var root = document.querySelector(rootSelector || 'body');
|
143
|
+
using = using || document;
|
144
|
+
if (angular.getTestability) {
|
145
|
+
return angular.getTestability(root).
|
146
|
+
findBindings(using, binding, exactMatch);
|
147
|
+
}
|
148
|
+
var bindings = using.getElementsByClassName('ng-binding');
|
149
|
+
var matches = [];
|
150
|
+
for (var i = 0; i < bindings.length; ++i) {
|
151
|
+
var dataBinding = angular.element(bindings[i]).data('$binding');
|
152
|
+
if (dataBinding) {
|
153
|
+
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
|
154
|
+
if (exactMatch) {
|
155
|
+
var matcher = new RegExp('({|\\s|^|\\|)' +
|
156
|
+
/* See http://stackoverflow.com/q/3561711 */
|
157
|
+
binding.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&') +
|
158
|
+
'(}|\\s|$|\\|)');
|
159
|
+
if (matcher.test(bindingName)) {
|
160
|
+
matches.push(bindings[i]);
|
161
|
+
}
|
162
|
+
} else {
|
163
|
+
if (bindingName.indexOf(binding) != -1) {
|
164
|
+
matches.push(bindings[i]);
|
165
|
+
}
|
166
|
+
}
|
167
|
+
|
168
|
+
}
|
169
|
+
}
|
170
|
+
return matches; /* Return the whole array for webdriver.findElements. */
|
171
|
+
}).apply(this, arguments); }
|
172
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [slowHttpStatus, false, null, body]])
|
173
|
+
15:51:43.241 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute script: try { return (function (binding, exactMatch, using, rootSelector) {
|
174
|
+
var root = document.querySelector(rootSelector || 'body');
|
175
|
+
using = using || document;
|
176
|
+
if (angular.getTestability) {
|
177
|
+
return angular.getTestability(root).
|
178
|
+
findBindings(using, binding, exactMatch);
|
179
|
+
}
|
180
|
+
var bindings = using.getElementsByClassName('ng-binding');
|
181
|
+
var matches = [];
|
182
|
+
for (var i = 0; i < bindings.length; ++i) {
|
183
|
+
var dataBinding = angular.element(bindings[i]).data('$binding');
|
184
|
+
if (dataBinding) {
|
185
|
+
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
|
186
|
+
if (exactMatch) {
|
187
|
+
var matcher = new RegExp('({|\\s|^|\\|)' +
|
188
|
+
/* See http://stackoverflow.com/q/3561711 */
|
189
|
+
binding.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&') +
|
190
|
+
'(}|\\s|$|\\|)');
|
191
|
+
if (matcher.test(bindingName)) {
|
192
|
+
matches.push(bindings[i]);
|
193
|
+
}
|
194
|
+
} else {
|
195
|
+
if (bindingName.indexOf(binding) != -1) {
|
196
|
+
matches.push(bindings[i]);
|
197
|
+
}
|
198
|
+
}
|
199
|
+
|
200
|
+
}
|
201
|
+
}
|
202
|
+
return matches; /* Return the whole array for webdriver.findElements. */
|
203
|
+
}).apply(this, arguments); }
|
204
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [slowHttpStatus, false, null, body]]
|
205
|
+
15:51:43.255 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@58ceb9cc -> unknown locator]])
|
206
|
+
15:51:43.302 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@58ceb9cc -> unknown locator]]
|
207
|
+
15:51:43.317 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute async script: try { return (function (rootSelector, callback) {
|
208
|
+
var el = document.querySelector(rootSelector);
|
209
|
+
|
210
|
+
try {
|
211
|
+
if (!window.angular) {
|
212
|
+
throw new Error('angular could not be found on the window');
|
213
|
+
}
|
214
|
+
if (angular.getTestability) {
|
215
|
+
angular.getTestability(el).whenStable(callback);
|
216
|
+
} else {
|
217
|
+
if (!angular.element(el).injector()) {
|
218
|
+
throw new Error('root element (' + rootSelector + ') has no injector.' +
|
219
|
+
' this may mean it is not inside ng-app.');
|
220
|
+
}
|
221
|
+
angular.element(el).injector().get('$browser').
|
222
|
+
notifyWhenNoOutstandingRequests(callback);
|
223
|
+
}
|
224
|
+
} catch (err) {
|
225
|
+
callback(err.message);
|
226
|
+
}
|
227
|
+
}).apply(this, arguments); }
|
228
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]])
|
229
|
+
15:51:43.369 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute async script: try { return (function (rootSelector, callback) {
|
230
|
+
var el = document.querySelector(rootSelector);
|
231
|
+
|
232
|
+
try {
|
233
|
+
if (!window.angular) {
|
234
|
+
throw new Error('angular could not be found on the window');
|
235
|
+
}
|
236
|
+
if (angular.getTestability) {
|
237
|
+
angular.getTestability(el).whenStable(callback);
|
238
|
+
} else {
|
239
|
+
if (!angular.element(el).injector()) {
|
240
|
+
throw new Error('root element (' + rootSelector + ') has no injector.' +
|
241
|
+
' this may mean it is not inside ng-app.');
|
242
|
+
}
|
243
|
+
angular.element(el).injector().get('$browser').
|
244
|
+
notifyWhenNoOutstandingRequests(callback);
|
245
|
+
}
|
246
|
+
} catch (err) {
|
247
|
+
callback(err.message);
|
248
|
+
}
|
249
|
+
}).apply(this, arguments); }
|
250
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]]
|
251
|
+
15:51:43.386 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute script: try { return (function (binding, exactMatch, using, rootSelector) {
|
252
|
+
var root = document.querySelector(rootSelector || 'body');
|
253
|
+
using = using || document;
|
254
|
+
if (angular.getTestability) {
|
255
|
+
return angular.getTestability(root).
|
256
|
+
findBindings(using, binding, exactMatch);
|
257
|
+
}
|
258
|
+
var bindings = using.getElementsByClassName('ng-binding');
|
259
|
+
var matches = [];
|
260
|
+
for (var i = 0; i < bindings.length; ++i) {
|
261
|
+
var dataBinding = angular.element(bindings[i]).data('$binding');
|
262
|
+
if (dataBinding) {
|
263
|
+
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
|
264
|
+
if (exactMatch) {
|
265
|
+
var matcher = new RegExp('({|\\s|^|\\|)' +
|
266
|
+
/* See http://stackoverflow.com/q/3561711 */
|
267
|
+
binding.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&') +
|
268
|
+
'(}|\\s|$|\\|)');
|
269
|
+
if (matcher.test(bindingName)) {
|
270
|
+
matches.push(bindings[i]);
|
271
|
+
}
|
272
|
+
} else {
|
273
|
+
if (bindingName.indexOf(binding) != -1) {
|
274
|
+
matches.push(bindings[i]);
|
275
|
+
}
|
276
|
+
}
|
277
|
+
|
278
|
+
}
|
279
|
+
}
|
280
|
+
return matches; /* Return the whole array for webdriver.findElements. */
|
281
|
+
}).apply(this, arguments); }
|
282
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [slowHttpStatus, false, null, body]])
|
283
|
+
15:51:43.430 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute script: try { return (function (binding, exactMatch, using, rootSelector) {
|
284
|
+
var root = document.querySelector(rootSelector || 'body');
|
285
|
+
using = using || document;
|
286
|
+
if (angular.getTestability) {
|
287
|
+
return angular.getTestability(root).
|
288
|
+
findBindings(using, binding, exactMatch);
|
289
|
+
}
|
290
|
+
var bindings = using.getElementsByClassName('ng-binding');
|
291
|
+
var matches = [];
|
292
|
+
for (var i = 0; i < bindings.length; ++i) {
|
293
|
+
var dataBinding = angular.element(bindings[i]).data('$binding');
|
294
|
+
if (dataBinding) {
|
295
|
+
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
|
296
|
+
if (exactMatch) {
|
297
|
+
var matcher = new RegExp('({|\\s|^|\\|)' +
|
298
|
+
/* See http://stackoverflow.com/q/3561711 */
|
299
|
+
binding.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&') +
|
300
|
+
'(}|\\s|$|\\|)');
|
301
|
+
if (matcher.test(bindingName)) {
|
302
|
+
matches.push(bindings[i]);
|
303
|
+
}
|
304
|
+
} else {
|
305
|
+
if (bindingName.indexOf(binding) != -1) {
|
306
|
+
matches.push(bindings[i]);
|
307
|
+
}
|
308
|
+
}
|
309
|
+
|
310
|
+
}
|
311
|
+
}
|
312
|
+
return matches; /* Return the whole array for webdriver.findElements. */
|
313
|
+
}).apply(this, arguments); }
|
314
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [slowHttpStatus, false, null, body]]
|
315
|
+
15:51:43.452 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@58ceb9cc -> unknown locator]])
|
316
|
+
15:51:43.493 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@58ceb9cc -> unknown locator]]
|
317
|
+
15:51:43.508 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute async script: try { return (function (rootSelector, callback) {
|
318
|
+
var el = document.querySelector(rootSelector);
|
319
|
+
|
320
|
+
try {
|
321
|
+
if (!window.angular) {
|
322
|
+
throw new Error('angular could not be found on the window');
|
323
|
+
}
|
324
|
+
if (angular.getTestability) {
|
325
|
+
angular.getTestability(el).whenStable(callback);
|
326
|
+
} else {
|
327
|
+
if (!angular.element(el).injector()) {
|
328
|
+
throw new Error('root element (' + rootSelector + ') has no injector.' +
|
329
|
+
' this may mean it is not inside ng-app.');
|
330
|
+
}
|
331
|
+
angular.element(el).injector().get('$browser').
|
332
|
+
notifyWhenNoOutstandingRequests(callback);
|
333
|
+
}
|
334
|
+
} catch (err) {
|
335
|
+
callback(err.message);
|
336
|
+
}
|
337
|
+
}).apply(this, arguments); }
|
338
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]])
|
339
|
+
15:51:43.552 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute async script: try { return (function (rootSelector, callback) {
|
340
|
+
var el = document.querySelector(rootSelector);
|
341
|
+
|
342
|
+
try {
|
343
|
+
if (!window.angular) {
|
344
|
+
throw new Error('angular could not be found on the window');
|
345
|
+
}
|
346
|
+
if (angular.getTestability) {
|
347
|
+
angular.getTestability(el).whenStable(callback);
|
348
|
+
} else {
|
349
|
+
if (!angular.element(el).injector()) {
|
350
|
+
throw new Error('root element (' + rootSelector + ') has no injector.' +
|
351
|
+
' this may mean it is not inside ng-app.');
|
352
|
+
}
|
353
|
+
angular.element(el).injector().get('$browser').
|
354
|
+
notifyWhenNoOutstandingRequests(callback);
|
355
|
+
}
|
356
|
+
} catch (err) {
|
357
|
+
callback(err.message);
|
358
|
+
}
|
359
|
+
}).apply(this, arguments); }
|
360
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]]
|
361
|
+
15:51:43.573 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute script: try { return (function (binding, exactMatch, using, rootSelector) {
|
362
|
+
var root = document.querySelector(rootSelector || 'body');
|
363
|
+
using = using || document;
|
364
|
+
if (angular.getTestability) {
|
365
|
+
return angular.getTestability(root).
|
366
|
+
findBindings(using, binding, exactMatch);
|
367
|
+
}
|
368
|
+
var bindings = using.getElementsByClassName('ng-binding');
|
369
|
+
var matches = [];
|
370
|
+
for (var i = 0; i < bindings.length; ++i) {
|
371
|
+
var dataBinding = angular.element(bindings[i]).data('$binding');
|
372
|
+
if (dataBinding) {
|
373
|
+
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
|
374
|
+
if (exactMatch) {
|
375
|
+
var matcher = new RegExp('({|\\s|^|\\|)' +
|
376
|
+
/* See http://stackoverflow.com/q/3561711 */
|
377
|
+
binding.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&') +
|
378
|
+
'(}|\\s|$|\\|)');
|
379
|
+
if (matcher.test(bindingName)) {
|
380
|
+
matches.push(bindings[i]);
|
381
|
+
}
|
382
|
+
} else {
|
383
|
+
if (bindingName.indexOf(binding) != -1) {
|
384
|
+
matches.push(bindings[i]);
|
385
|
+
}
|
386
|
+
}
|
387
|
+
|
388
|
+
}
|
389
|
+
}
|
390
|
+
return matches; /* Return the whole array for webdriver.findElements. */
|
391
|
+
}).apply(this, arguments); }
|
392
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [slowHttpStatus, false, null, body]])
|
393
|
+
15:51:43.619 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [execute script: try { return (function (binding, exactMatch, using, rootSelector) {
|
394
|
+
var root = document.querySelector(rootSelector || 'body');
|
395
|
+
using = using || document;
|
396
|
+
if (angular.getTestability) {
|
397
|
+
return angular.getTestability(root).
|
398
|
+
findBindings(using, binding, exactMatch);
|
399
|
+
}
|
400
|
+
var bindings = using.getElementsByClassName('ng-binding');
|
401
|
+
var matches = [];
|
402
|
+
for (var i = 0; i < bindings.length; ++i) {
|
403
|
+
var dataBinding = angular.element(bindings[i]).data('$binding');
|
404
|
+
if (dataBinding) {
|
405
|
+
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
|
406
|
+
if (exactMatch) {
|
407
|
+
var matcher = new RegExp('({|\\s|^|\\|)' +
|
408
|
+
/* See http://stackoverflow.com/q/3561711 */
|
409
|
+
binding.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&') +
|
410
|
+
'(}|\\s|$|\\|)');
|
411
|
+
if (matcher.test(bindingName)) {
|
412
|
+
matches.push(bindings[i]);
|
413
|
+
}
|
414
|
+
} else {
|
415
|
+
if (bindingName.indexOf(binding) != -1) {
|
416
|
+
matches.push(bindings[i]);
|
417
|
+
}
|
418
|
+
}
|
419
|
+
|
420
|
+
}
|
421
|
+
}
|
422
|
+
return matches; /* Return the whole array for webdriver.findElements. */
|
423
|
+
}).apply(this, arguments); }
|
424
|
+
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [slowHttpStatus, false, null, body]]
|
425
|
+
15:51:43.635 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@58ceb9cc -> unknown locator]])
|
426
|
+
15:51:43.700 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@58ceb9cc -> unknown locator]]
|
427
|
+
15:51:43.730 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Executing: [delete session: 90d3b5c4-6af6-4c14-8660-aa60fe91dd1f])
|
428
|
+
15:51:43.839 INFO [15] org.openqa.selenium.remote.server.DriverServlet - Done: [delete session: 90d3b5c4-6af6-4c14-8660-aa60fe91dd1f]
|
429
|
+
15:51:57.102 INFO [16] org.openqa.selenium.server.SeleniumServer - Shutting down...
|
@@ -0,0 +1,86 @@
|
|
1
|
+
var util = require('util');
|
2
|
+
|
3
|
+
describe('synchronizing with slow pages', function() {
|
4
|
+
beforeEach(function() {
|
5
|
+
browser.get('index.html#/async');
|
6
|
+
});
|
7
|
+
|
8
|
+
it('waits for http calls', function() {
|
9
|
+
var status = element(by.binding('slowHttpStatus'));
|
10
|
+
|
11
|
+
expect(status.getText()).toEqual('not started');
|
12
|
+
expect(status.getText()).toEqual('not started');
|
13
|
+
expect(status.getText()).toEqual('not started');
|
14
|
+
});
|
15
|
+
});
|
16
|
+
|
17
|
+
In protractor, element() is lazily evaluated.
|
18
|
+
|
19
|
+
element(by.binding('...')) doesn't make a server call until an action
|
20
|
+
is performed on the element.
|
21
|
+
|
22
|
+
every action always re-finds the element. synchronization is done before
|
23
|
+
the element find method. if we didn't refind the element then sync wouldn't trigger
|
24
|
+
when interacting with elements.
|
25
|
+
|
26
|
+
-----
|
27
|
+
|
28
|
+
Launching a standalone server
|
29
|
+
Writing debug logs to angular_sync.txt
|
30
|
+
Java: Oracle Corporation 25.25-b02
|
31
|
+
OS: Mac OS X 10.10.3 x86_64
|
32
|
+
v2.45.0, with Core v2.45.0. Built from revision 5017cb8
|
33
|
+
Default driver org.openqa.selenium.ie.InternetExplorerDriver registration is skipped: registration capabilities Capabilities [{ensureCleanSession=true, browserName=internet explorer, version=, platform=WINDOWS}] does not match with current platform: MAC
|
34
|
+
RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
|
35
|
+
Version Jetty/5.1.x
|
36
|
+
Started HttpContext[/selenium-server,/selenium-server]
|
37
|
+
Started org.openqa.jetty.jetty.servlet.ServletHandler@5ba23b66
|
38
|
+
Started HttpContext[/wd,/wd]
|
39
|
+
Started HttpContext[/selenium-server/driver,/selenium-server/driver]
|
40
|
+
Started HttpContext[/,/]
|
41
|
+
Started SocketListener on 0.0.0.0:4444
|
42
|
+
Started org.openqa.jetty.jetty.Server@7e6cbb7a
|
43
|
+
Executing: [new session: Capabilities [{count=1, browserName=firefox, version=ANY}]])
|
44
|
+
Creating a new session for Capabilities [{count=1, browserName=firefox, version=ANY}]
|
45
|
+
Executing: [set script timeoutt: 11000])
|
46
|
+
Executing: [get: data:text/html,<html></html>])
|
47
|
+
|
48
|
+
// get localhost:8081/index.html#/async
|
49
|
+
Executing: [execute script: window.name = "NG_DEFER_BOOTSTRAP!" + window.name;window.location.replace("http://localhost:8081/index.html#/async");, []])
|
50
|
+
Executing: [execute script: return window.location.href;, []])
|
51
|
+
Executing: [execute async script: Protractor.testForAngular, [10]])
|
52
|
+
|
53
|
+
Executing: [execute script: return (function () {
|
54
|
+
angular.module('protractorBaseModule_', []).
|
55
|
+
config(['$compileProvider', function($compileProvider) {
|
56
|
+
if ($compileProvider.debugInfoEnabled) {
|
57
|
+
$compileProvider.debugInfoEnabled(true);
|
58
|
+
}
|
59
|
+
}]);
|
60
|
+
}).apply(null, arguments);, []])
|
61
|
+
angular.module('protractorBaseModule_', []).
|
62
|
+
config(['$compileProvider', function($compileProvider) {
|
63
|
+
if ($compileProvider.debugInfoEnabled) {
|
64
|
+
$compileProvider.debugInfoEnabled(true);
|
65
|
+
}
|
66
|
+
}]);
|
67
|
+
}).apply(null, arguments);, []]
|
68
|
+
Executing: [execute script: angular.resumeBootstrap(arguments[0]);, [[protractorBaseModule_]]])
|
69
|
+
|
70
|
+
// wait for angular, by.binding slowHttpStatus, get text
|
71
|
+
Executing: [execute async script: Protractor.waitForAngular, [body]])
|
72
|
+
Executing: [execute script: Protractor by.binding, [slowHttpStatus, false, null, body]])
|
73
|
+
Executing: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@58ceb9cc -> unknown locator]])
|
74
|
+
|
75
|
+
// wait for angular, by.binding slowHttpStatus, get text
|
76
|
+
Executing: [execute async script: Protractor.waitForAngular, [body]])
|
77
|
+
Executing: [execute script: Protractor by.binding, [slowHttpStatus, false, null, body]])
|
78
|
+
Executing: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@58ceb9cc -> unknown locator]])
|
79
|
+
|
80
|
+
// wait for angular, by.binding slowHttpStatus, get text
|
81
|
+
Executing: [execute async script: Protractor.waitForAngular, [body]])
|
82
|
+
Executing: [execute script: Protractor by.binding, [slowHttpStatus, false, null, body]])
|
83
|
+
Executing: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@58ceb9cc -> unknown locator]])
|
84
|
+
|
85
|
+
Executing: [delete session: 90d3b5c4-6af6-4c14-8660-aa60fe91dd1f])
|
86
|
+
Shutting down...
|
metadata
CHANGED
@@ -1,29 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: angular_webdriver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- code@bootstraponline.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.46.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.46.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: watir-webdriver
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.7.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.7.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: webdriver_utils
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
16
44
|
requirements:
|
17
45
|
- - ">="
|
18
46
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
47
|
+
version: 0.0.5
|
20
48
|
type: :runtime
|
21
49
|
prerelease: false
|
22
50
|
version_requirements: !ruby/object:Gem::Requirement
|
23
51
|
requirements:
|
24
52
|
- - ">="
|
25
53
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
54
|
+
version: 0.0.5
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: rspec
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,19 +95,19 @@ dependencies:
|
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: 0.10.1
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
98
|
+
name: trace_files
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
|
-
- - "
|
101
|
+
- - "~>"
|
74
102
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.0.
|
103
|
+
version: 0.0.2
|
76
104
|
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
|
-
- - "
|
108
|
+
- - "~>"
|
81
109
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.0.
|
110
|
+
version: 0.0.2
|
83
111
|
description: Angular webdriver.
|
84
112
|
email:
|
85
113
|
- code@bootstraponline.com
|
@@ -88,23 +116,68 @@ extensions: []
|
|
88
116
|
extra_rdoc_files: []
|
89
117
|
files:
|
90
118
|
- ".gitignore"
|
119
|
+
- ".gitmodules"
|
120
|
+
- ".rspec"
|
121
|
+
- ".travis.yml"
|
91
122
|
- Gemfile
|
92
|
-
- LICENSE
|
93
123
|
- Thorfile
|
94
124
|
- angular_webdriver.gemspec
|
125
|
+
- docs/overview.md
|
126
|
+
- docs/sync.md
|
95
127
|
- lib/angular_webdriver.rb
|
96
|
-
- lib/angular_webdriver/protractor/
|
97
|
-
- lib/angular_webdriver/protractor/
|
98
|
-
- lib/angular_webdriver/protractor/
|
99
|
-
- lib/angular_webdriver/protractor/get_url_trace.rb
|
128
|
+
- lib/angular_webdriver/protractor/by.rb
|
129
|
+
- lib/angular_webdriver/protractor/by_repeater_inner.rb
|
130
|
+
- lib/angular_webdriver/protractor/client_side_scripts.rb
|
100
131
|
- lib/angular_webdriver/protractor/protractor.rb
|
101
|
-
- lib/angular_webdriver/protractor/
|
102
|
-
- lib/angular_webdriver/protractor/
|
132
|
+
- lib/angular_webdriver/protractor/protractor_element.rb
|
133
|
+
- lib/angular_webdriver/protractor/rspec_helpers.rb
|
134
|
+
- lib/angular_webdriver/protractor/watir_patch.rb
|
135
|
+
- lib/angular_webdriver/protractor/webdriver_patch.rb
|
103
136
|
- lib/angular_webdriver/version.rb
|
137
|
+
- license/angular_webdriver/LICENSE.txt
|
138
|
+
- license/protractor/LICENSE.txt
|
139
|
+
- notes/bootstrap_notes.md
|
140
|
+
- notes/element_by_id/element_by_id_sync_off.txt
|
141
|
+
- notes/element_by_id/element_by_id_sync_on.txt
|
142
|
+
- notes/element_chaining_debug.txt
|
143
|
+
- notes/evaluate/js_evaluate_sync_on.txt
|
144
|
+
- notes/evaluate/ruby_evaluate_sync_on.txt
|
145
|
+
- notes/get_title/browser_get_title_sync_off.txt
|
146
|
+
- notes/get_title/browser_get_title_sync_on.txt
|
147
|
+
- notes/phantomjs.md
|
148
|
+
- notes/protractor_cli_bugs.txt
|
149
|
+
- notes/protractor_get/protractor_get.rb
|
150
|
+
- notes/protractor_get/protractor_get_website_sync_off.txt
|
151
|
+
- notes/protractor_get/protractor_get_website_sync_on.txt
|
152
|
+
- notes/repeater/findAllRepeaterRows_annotated.txt
|
153
|
+
- notes/repeater/findAllRepeaterRows_raw.txt
|
154
|
+
- notes/repeater/findRepeaterColumn_annotated.txt
|
155
|
+
- notes/repeater/findRepeaterColumn_raw.txt
|
156
|
+
- notes/repeater/findRepeaterElement_annotated.txt
|
157
|
+
- notes/repeater/findRepeaterElement_raw.txt
|
158
|
+
- notes/repeater/findRepeaterRows_annotated.txt
|
159
|
+
- notes/repeater/findRepeaterRows_raw.txt
|
160
|
+
- notes/sync_after.md
|
161
|
+
- notes/sync_notes.md
|
162
|
+
- notes/synchronize_spec/status_gettext.txt
|
163
|
+
- notes/synchronize_spec/status_gettext_x3.txt
|
164
|
+
- notes/synchronize_spec/synchronize_spec.js.txt
|
165
|
+
- notes/synchronize_spec/watir_gettext.txt
|
104
166
|
- readme.md
|
105
167
|
- release_notes.md
|
106
|
-
-
|
107
|
-
-
|
168
|
+
- selenium_server/lib/logs.rb
|
169
|
+
- selenium_server/lib/selenium_server.rb
|
170
|
+
- selenium_server/readme.md
|
171
|
+
- selenium_server/spec/logs_spec.rb
|
172
|
+
- selenium_server/spec/nodejs_sync_spec_waithttp_annotated.txt
|
173
|
+
- selenium_server/spec/nodejs_sync_spec_waithttp_raw.txt
|
174
|
+
- selenium_server/spec/nodejs_sync_spec_waithttp_raw_processed.txt
|
175
|
+
- selenium_server/spec/ruby_sync_spec_waithttp_annotated.txt
|
176
|
+
- selenium_server/spec/ruby_sync_spec_waithttp_raw.txt
|
177
|
+
- selenium_server/spec/ruby_sync_spec_waithttp_raw_processed.txt
|
178
|
+
- selenium_server/spec/spec_helper.rb
|
179
|
+
- selenium_server/spec/status_gettext_x3.txt
|
180
|
+
- selenium_server/spec/status_gettext_x3_annotated.txt
|
108
181
|
homepage: https://github.com/bootstraponline/angular_webdriver
|
109
182
|
licenses:
|
110
183
|
- http://www.apache.org/licenses/LICENSE-2.0.txt
|