angular_webdriver 0.0.7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +32 -0
  6. data/Gemfile +2 -0
  7. data/Thorfile +33 -1
  8. data/angular_webdriver.gemspec +10 -3
  9. data/docs/overview.md +101 -0
  10. data/docs/sync.md +53 -0
  11. data/lib/angular_webdriver/protractor/by.rb +331 -0
  12. data/lib/angular_webdriver/protractor/by_repeater_inner.rb +106 -0
  13. data/lib/angular_webdriver/protractor/client_side_scripts.rb +1035 -0
  14. data/lib/angular_webdriver/protractor/protractor.rb +396 -77
  15. data/lib/angular_webdriver/protractor/protractor_element.rb +33 -0
  16. data/lib/angular_webdriver/protractor/rspec_helpers.rb +19 -0
  17. data/lib/angular_webdriver/protractor/watir_patch.rb +209 -0
  18. data/lib/angular_webdriver/protractor/webdriver_patch.rb +246 -0
  19. data/lib/angular_webdriver/version.rb +2 -2
  20. data/lib/angular_webdriver.rb +14 -1
  21. data/{LICENSE → license/angular_webdriver/LICENSE.txt} +0 -0
  22. data/{lib/angular_webdriver → license}/protractor/LICENSE.txt +0 -0
  23. data/{lib/angular_webdriver/protractor/get_url_trace.rb → notes/bootstrap_notes.md} +13 -0
  24. data/notes/element_by_id/element_by_id_sync_off.txt +12 -0
  25. data/notes/element_by_id/element_by_id_sync_on.txt +74 -0
  26. data/notes/element_chaining_debug.txt +94 -0
  27. data/notes/evaluate/js_evaluate_sync_on.txt +60 -0
  28. data/notes/evaluate/ruby_evaluate_sync_on.txt +35 -0
  29. data/notes/get_title/browser_get_title_sync_off.txt +11 -0
  30. data/notes/get_title/browser_get_title_sync_on.txt +54 -0
  31. data/notes/phantomjs.md +23 -0
  32. data/notes/protractor_cli_bugs.txt +39 -0
  33. data/notes/protractor_get/protractor_get.rb +102 -0
  34. data/notes/protractor_get/protractor_get_website_sync_off.txt +11 -0
  35. data/notes/protractor_get/protractor_get_website_sync_on.txt +86 -0
  36. data/notes/repeater/findAllRepeaterRows_annotated.txt +150 -0
  37. data/notes/repeater/findAllRepeaterRows_raw.txt +145 -0
  38. data/notes/repeater/findRepeaterColumn_annotated.txt +317 -0
  39. data/notes/repeater/findRepeaterColumn_raw.txt +310 -0
  40. data/notes/repeater/findRepeaterElement_annotated.txt +152 -0
  41. data/notes/repeater/findRepeaterElement_raw.txt +146 -0
  42. data/notes/repeater/findRepeaterRows_annotated.txt +156 -0
  43. data/notes/repeater/findRepeaterRows_raw.txt +152 -0
  44. data/notes/sync_after.md +46 -0
  45. data/notes/sync_notes.md +137 -0
  46. data/notes/synchronize_spec/status_gettext.txt +121 -0
  47. data/notes/synchronize_spec/status_gettext_x3.txt +451 -0
  48. data/notes/synchronize_spec/synchronize_spec.js.txt +74 -0
  49. data/notes/synchronize_spec/watir_gettext.txt +73 -0
  50. data/readme.md +52 -12
  51. data/release_notes.md +127 -0
  52. data/selenium_server/lib/logs.rb +50 -0
  53. data/selenium_server/lib/selenium_server.rb +21 -0
  54. data/selenium_server/readme.md +3 -0
  55. data/selenium_server/spec/logs_spec.rb +18 -0
  56. data/selenium_server/spec/nodejs_sync_spec_waithttp_annotated.txt +54 -0
  57. data/selenium_server/spec/nodejs_sync_spec_waithttp_raw.txt +367 -0
  58. data/selenium_server/spec/nodejs_sync_spec_waithttp_raw_processed.txt +43 -0
  59. data/selenium_server/spec/ruby_sync_spec_waithttp_annotated.txt +59 -0
  60. data/selenium_server/spec/ruby_sync_spec_waithttp_raw.txt +267 -0
  61. data/selenium_server/spec/ruby_sync_spec_waithttp_raw_processed.txt +39 -0
  62. data/selenium_server/spec/spec_helper.rb +6 -0
  63. data/selenium_server/spec/status_gettext_x3.txt +429 -0
  64. data/selenium_server/spec/status_gettext_x3_annotated.txt +86 -0
  65. metadata +91 -18
  66. data/lib/angular_webdriver/protractor/clientSideScripts.json +0 -19
  67. data/lib/angular_webdriver/protractor/clientsidescripts.js +0 -671
  68. data/lib/angular_webdriver/protractor/scripts.rb +0 -7
  69. data/lib/angular_webdriver/protractor/scripts_to_json.js +0 -11
  70. data/spec/protractor_spec.rb +0 -40
  71. data/spec/spec_helper.rb +0 -5
@@ -0,0 +1,145 @@
1
+ browser.get('http://localhost:8081/#/repeater')
2
+ var partialMatch = element(by.repeater('baz in days'));
3
+ partialMatch.getText()
4
+
5
+
6
+ 16:09:01.247 INFO - Executing: [execute script: , []])
7
+ 16:09:01.247 INFO - Executing: [execute script: , []])
8
+ 16:09:01.248 INFO - Executing: [execute script: , []])
9
+ 16:09:01.247 INFO - Executing: [execute async script: try { return (function (rootSelector, callback) {
10
+ var el = document.querySelector(rootSelector);
11
+
12
+ try {
13
+ if (!window.angular) {
14
+ throw new Error('angular could not be found on the window');
15
+ }
16
+ if (angular.getTestability) {
17
+ angular.getTestability(el).whenStable(callback);
18
+ } else {
19
+ if (!angular.element(el).injector()) {
20
+ throw new Error('root element (' + rootSelector + ') has no injector.' +
21
+ ' this may mean it is not inside ng-app.');
22
+ }
23
+ angular.element(el).injector().get('$browser').
24
+ notifyWhenNoOutstandingRequests(callback);
25
+ }
26
+ } catch (err) {
27
+ callback(err.message);
28
+ }
29
+ }).apply(this, arguments); }
30
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]])
31
+ 16:09:01.274 INFO - Done: [execute script: , []]
32
+ 16:09:01.338 INFO - Done: [execute script: , []]
33
+ 16:09:01.392 INFO - Done: [execute script: , []]
34
+ 16:09:01.450 INFO - Done: [execute async script: try { return (function (rootSelector, callback) {
35
+ var el = document.querySelector(rootSelector);
36
+
37
+ try {
38
+ if (!window.angular) {
39
+ throw new Error('angular could not be found on the window');
40
+ }
41
+ if (angular.getTestability) {
42
+ angular.getTestability(el).whenStable(callback);
43
+ } else {
44
+ if (!angular.element(el).injector()) {
45
+ throw new Error('root element (' + rootSelector + ') has no injector.' +
46
+ ' this may mean it is not inside ng-app.');
47
+ }
48
+ angular.element(el).injector().get('$browser').
49
+ notifyWhenNoOutstandingRequests(callback);
50
+ }
51
+ } catch (err) {
52
+ callback(err.message);
53
+ }
54
+ }).apply(this, arguments); }
55
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]]
56
+ 16:09:01.467 INFO - Executing: [execute script: try { return (function (repeater, exact, using) {
57
+ function repeaterMatch(ngRepeat, repeater, exact) {
58
+ if (exact) {
59
+ return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].
60
+ trim() == repeater;
61
+ } else {
62
+ return ngRepeat.indexOf(repeater) != -1;
63
+ }
64
+ }
65
+
66
+ using = using || document;
67
+
68
+ var rows = [];
69
+ var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\:'];
70
+ for (var p = 0; p < prefixes.length; ++p) {
71
+ var attr = prefixes[p] + 'repeat';
72
+ var repeatElems = using.querySelectorAll('[' + attr + ']');
73
+ attr = attr.replace(/\\/g, '');
74
+ for (var i = 0; i < repeatElems.length; ++i) {
75
+ if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {
76
+ rows.push(repeatElems[i]);
77
+ }
78
+ }
79
+ }
80
+ for (var p = 0; p < prefixes.length; ++p) {
81
+ var attr = prefixes[p] + 'repeat-start';
82
+ var repeatElems = using.querySelectorAll('[' + attr + ']');
83
+ attr = attr.replace(/\\/g, '');
84
+ for (var i = 0; i < repeatElems.length; ++i) {
85
+ if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {
86
+ var elem = repeatElems[i];
87
+ while (elem.nodeType != 8 ||
88
+ !repeaterMatch(elem.nodeValue, repeater, exact)) {
89
+ if (elem.nodeType == 1) {
90
+ rows.push(elem);
91
+ }
92
+ elem = elem.nextSibling;
93
+ }
94
+ }
95
+ }
96
+ }
97
+ return rows;
98
+ }).apply(this, arguments); }
99
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [baz in days, false, null, body]])
100
+ 16:09:01.554 INFO - Done: [execute script: try { return (function (repeater, exact, using) {
101
+ function repeaterMatch(ngRepeat, repeater, exact) {
102
+ if (exact) {
103
+ return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].
104
+ trim() == repeater;
105
+ } else {
106
+ return ngRepeat.indexOf(repeater) != -1;
107
+ }
108
+ }
109
+
110
+ using = using || document;
111
+
112
+ var rows = [];
113
+ var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\:'];
114
+ for (var p = 0; p < prefixes.length; ++p) {
115
+ var attr = prefixes[p] + 'repeat';
116
+ var repeatElems = using.querySelectorAll('[' + attr + ']');
117
+ attr = attr.replace(/\\/g, '');
118
+ for (var i = 0; i < repeatElems.length; ++i) {
119
+ if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {
120
+ rows.push(repeatElems[i]);
121
+ }
122
+ }
123
+ }
124
+ for (var p = 0; p < prefixes.length; ++p) {
125
+ var attr = prefixes[p] + 'repeat-start';
126
+ var repeatElems = using.querySelectorAll('[' + attr + ']');
127
+ attr = attr.replace(/\\/g, '');
128
+ for (var i = 0; i < repeatElems.length; ++i) {
129
+ if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {
130
+ var elem = repeatElems[i];
131
+ while (elem.nodeType != 8 ||
132
+ !repeaterMatch(elem.nodeValue, repeater, exact)) {
133
+ if (elem.nodeType == 1) {
134
+ rows.push(elem);
135
+ }
136
+ elem = elem.nextSibling;
137
+ }
138
+ }
139
+ }
140
+ }
141
+ return rows;
142
+ }).apply(this, arguments); }
143
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [baz in days, false, null, body]]
144
+ 16:09:01.570 INFO - Executing: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@a7eb949e -> unknown locator]])
145
+ 16:09:01.623 INFO - Done: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@a7eb949e -> unknown locator]]
@@ -0,0 +1,317 @@
1
+ browser.get('http://localhost:8081/#/repeater')
2
+
3
+ element(by.repeater('baz in days').column('b')).getText();
4
+
5
+ // wait for angular
6
+ 16:17:17.296 INFO - Executing: [execute async script: try { return (function (attempts, asyncCallback) {
7
+ var callback = function(args) {
8
+ setTimeout(function() {
9
+ asyncCallback(args);
10
+ }, 0);
11
+ };
12
+ var check = function(n) {
13
+ try {
14
+ if (window.angular && window.angular.resumeBootstrap) {
15
+ callback([true, null]);
16
+ } else if (n < 1) {
17
+ if (window.angular) {
18
+ callback([false, 'angular never provided resumeBootstrap']);
19
+ } else {
20
+ callback([false, 'retries looking for angular exceeded']);
21
+ }
22
+ } else {
23
+ window.setTimeout(function() {check(n - 1);}, 1000);
24
+ }
25
+ } catch (e) {
26
+ callback([false, e]);
27
+ }
28
+ };
29
+ check(attempts);
30
+ }).apply(this, arguments); }
31
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [10]])
32
+ 16:17:17.350 INFO - Done: [execute async script: try { return (function (attempts, asyncCallback) {
33
+ var callback = function(args) {
34
+ setTimeout(function() {
35
+ asyncCallback(args);
36
+ }, 0);
37
+ };
38
+ var check = function(n) {
39
+ try {
40
+ if (window.angular && window.angular.resumeBootstrap) {
41
+ callback([true, null]);
42
+ } else if (n < 1) {
43
+ if (window.angular) {
44
+ callback([false, 'angular never provided resumeBootstrap']);
45
+ } else {
46
+ callback([false, 'retries looking for angular exceeded']);
47
+ }
48
+ } else {
49
+ window.setTimeout(function() {check(n - 1);}, 1000);
50
+ }
51
+ } catch (e) {
52
+ callback([false, e]);
53
+ }
54
+ };
55
+ check(attempts);
56
+ }).apply(this, arguments); }
57
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [10]]
58
+ 16:17:17.369 INFO - Executing: [execute script: return (function () {
59
+ angular.module('protractorBaseModule_', []).
60
+ config(['$compileProvider', function($compileProvider) {
61
+ if ($compileProvider.debugInfoEnabled) {
62
+ $compileProvider.debugInfoEnabled(true);
63
+ }
64
+ }]);
65
+ }).apply(null, arguments);, []])
66
+ 16:17:17.420 INFO - Done: [execute script: return (function () {
67
+ angular.module('protractorBaseModule_', []).
68
+ config(['$compileProvider', function($compileProvider) {
69
+ if ($compileProvider.debugInfoEnabled) {
70
+ $compileProvider.debugInfoEnabled(true);
71
+ }
72
+ }]);
73
+ }).apply(null, arguments);, []]
74
+ 16:17:17.446 INFO - Executing: [execute script: angular.resumeBootstrap(arguments[0]);, [[protractorBaseModule_]]])
75
+ 16:17:17.525 INFO - Done: [execute script: angular.resumeBootstrap(arguments[0]);, [[protractorBaseModule_]]]
76
+ 16:17:18.682 INFO - Executing: [execute script: , []])
77
+ 16:17:18.682 INFO - Executing: [execute async script: try { return (function (rootSelector, callback) {
78
+ var el = document.querySelector(rootSelector);
79
+
80
+ try {
81
+ if (!window.angular) {
82
+ throw new Error('angular could not be found on the window');
83
+ }
84
+ if (angular.getTestability) {
85
+ angular.getTestability(el).whenStable(callback);
86
+ } else {
87
+ if (!angular.element(el).injector()) {
88
+ throw new Error('root element (' + rootSelector + ') has no injector.' +
89
+ ' this may mean it is not inside ng-app.');
90
+ }
91
+ angular.element(el).injector().get('$browser').
92
+ notifyWhenNoOutstandingRequests(callback);
93
+ }
94
+ } catch (err) {
95
+ callback(err.message);
96
+ }
97
+ }).apply(this, arguments); }
98
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]])
99
+ 16:17:18.703 INFO - Done: [execute script: , []]
100
+ 16:17:18.763 INFO - Done: [execute async script: try { return (function (rootSelector, callback) {
101
+ var el = document.querySelector(rootSelector);
102
+
103
+ try {
104
+ if (!window.angular) {
105
+ throw new Error('angular could not be found on the window');
106
+ }
107
+ if (angular.getTestability) {
108
+ angular.getTestability(el).whenStable(callback);
109
+ } else {
110
+ if (!angular.element(el).injector()) {
111
+ throw new Error('root element (' + rootSelector + ') has no injector.' +
112
+ ' this may mean it is not inside ng-app.');
113
+ }
114
+ angular.element(el).injector().get('$browser').
115
+ notifyWhenNoOutstandingRequests(callback);
116
+ }
117
+ } catch (err) {
118
+ callback(err.message);
119
+ }
120
+ }).apply(this, arguments); }
121
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body]]
122
+
123
+
124
+ // -- function (repeater, exact, binding, using, rootSelector)
125
+ // -- [baz in days, false, b, null, body]
126
+ // findRepeaterColumn
127
+
128
+ 16:17:18.782 INFO - Executing: [execute script: try { return (function (repeater, exact, binding, using, rootSelector) {
129
+ function repeaterMatch(ngRepeat, repeater, exact) {
130
+ if (exact) {
131
+ return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].
132
+ trim() == repeater;
133
+ } else {
134
+ return ngRepeat.indexOf(repeater) != -1;
135
+ }
136
+ }
137
+
138
+ var matches = [];
139
+ var root = document.querySelector(rootSelector || 'body');
140
+ using = using || document;
141
+
142
+ var rows = [];
143
+ var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\:'];
144
+ for (var p = 0; p < prefixes.length; ++p) {
145
+ var attr = prefixes[p] + 'repeat';
146
+ var repeatElems = using.querySelectorAll('[' + attr + ']');
147
+ attr = attr.replace(/\\/g, '');
148
+ for (var i = 0; i < repeatElems.length; ++i) {
149
+ if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {
150
+ rows.push(repeatElems[i]);
151
+ }
152
+ }
153
+ }
154
+ /* multiRows is an array of arrays, where each inner array contains
155
+ one row of elements. */
156
+ var multiRows = [];
157
+ for (var p = 0; p < prefixes.length; ++p) {
158
+ var attr = prefixes[p] + 'repeat-start';
159
+ var repeatElems = using.querySelectorAll('[' + attr + ']');
160
+ attr = attr.replace(/\\/g, '');
161
+ for (var i = 0; i < repeatElems.length; ++i) {
162
+ if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {
163
+ var elem = repeatElems[i];
164
+ var row = [];
165
+ while (elem.nodeType != 8 || (elem.nodeValue &&
166
+ !repeaterMatch(elem.nodeValue, repeater, exact))) {
167
+ if (elem.nodeType == 1) {
168
+ row.push(elem);
169
+ }
170
+ elem = elem.nextSibling;
171
+ }
172
+ multiRows.push(row);
173
+ }
174
+ }
175
+ }
176
+ var bindings = [];
177
+ for (var i = 0; i < rows.length; ++i) {
178
+ if (angular.getTestability) {
179
+ matches.push.apply(
180
+ matches,
181
+ angular.getTestability(root).findBindings(rows[i], binding));
182
+ } else {
183
+ if (rows[i].className.indexOf('ng-binding') != -1) {
184
+ bindings.push(rows[i]);
185
+ }
186
+ var childBindings = rows[i].getElementsByClassName('ng-binding');
187
+ for (var k = 0; k < childBindings.length; ++k) {
188
+ bindings.push(childBindings[k]);
189
+ }
190
+ }
191
+ }
192
+ for (var i = 0; i < multiRows.length; ++i) {
193
+ for (var j = 0; j < multiRows[i].length; ++j) {
194
+ if (angular.getTestability) {
195
+ matches.push.apply(
196
+ matches,
197
+ angular.getTestability(root).findBindings(multiRows[i][j], binding));
198
+ } else {
199
+ var elem = multiRows[i][j];
200
+ if (elem.className.indexOf('ng-binding') != -1) {
201
+ bindings.push(elem);
202
+ }
203
+ var childBindings = elem.getElementsByClassName('ng-binding');
204
+ for (var k = 0; k < childBindings.length; ++k) {
205
+ bindings.push(childBindings[k]);
206
+ }
207
+ }
208
+ }
209
+ }
210
+ for (var j = 0; j < bindings.length; ++j) {
211
+ var dataBinding = angular.element(bindings[j]).data('$binding');
212
+ if (dataBinding) {
213
+ var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
214
+ if (bindingName.indexOf(binding) != -1) {
215
+ matches.push(bindings[j]);
216
+ }
217
+ }
218
+ }
219
+ return matches;
220
+ }).apply(this, arguments); }
221
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [baz in days, false, b, null, body]])
222
+ 16:17:18.876 INFO - Done: [execute script: try { return (function (repeater, exact, binding, using, rootSelector) {
223
+ function repeaterMatch(ngRepeat, repeater, exact) {
224
+ if (exact) {
225
+ return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].
226
+ trim() == repeater;
227
+ } else {
228
+ return ngRepeat.indexOf(repeater) != -1;
229
+ }
230
+ }
231
+
232
+ var matches = [];
233
+ var root = document.querySelector(rootSelector || 'body');
234
+ using = using || document;
235
+
236
+ var rows = [];
237
+ var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\:'];
238
+ for (var p = 0; p < prefixes.length; ++p) {
239
+ var attr = prefixes[p] + 'repeat';
240
+ var repeatElems = using.querySelectorAll('[' + attr + ']');
241
+ attr = attr.replace(/\\/g, '');
242
+ for (var i = 0; i < repeatElems.length; ++i) {
243
+ if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {
244
+ rows.push(repeatElems[i]);
245
+ }
246
+ }
247
+ }
248
+ /* multiRows is an array of arrays, where each inner array contains
249
+ one row of elements. */
250
+ var multiRows = [];
251
+ for (var p = 0; p < prefixes.length; ++p) {
252
+ var attr = prefixes[p] + 'repeat-start';
253
+ var repeatElems = using.querySelectorAll('[' + attr + ']');
254
+ attr = attr.replace(/\\/g, '');
255
+ for (var i = 0; i < repeatElems.length; ++i) {
256
+ if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {
257
+ var elem = repeatElems[i];
258
+ var row = [];
259
+ while (elem.nodeType != 8 || (elem.nodeValue &&
260
+ !repeaterMatch(elem.nodeValue, repeater, exact))) {
261
+ if (elem.nodeType == 1) {
262
+ row.push(elem);
263
+ }
264
+ elem = elem.nextSibling;
265
+ }
266
+ multiRows.push(row);
267
+ }
268
+ }
269
+ }
270
+ var bindings = [];
271
+ for (var i = 0; i < rows.length; ++i) {
272
+ if (angular.getTestability) {
273
+ matches.push.apply(
274
+ matches,
275
+ angular.getTestability(root).findBindings(rows[i], binding));
276
+ } else {
277
+ if (rows[i].className.indexOf('ng-binding') != -1) {
278
+ bindings.push(rows[i]);
279
+ }
280
+ var childBindings = rows[i].getElementsByClassName('ng-binding');
281
+ for (var k = 0; k < childBindings.length; ++k) {
282
+ bindings.push(childBindings[k]);
283
+ }
284
+ }
285
+ }
286
+ for (var i = 0; i < multiRows.length; ++i) {
287
+ for (var j = 0; j < multiRows[i].length; ++j) {
288
+ if (angular.getTestability) {
289
+ matches.push.apply(
290
+ matches,
291
+ angular.getTestability(root).findBindings(multiRows[i][j], binding));
292
+ } else {
293
+ var elem = multiRows[i][j];
294
+ if (elem.className.indexOf('ng-binding') != -1) {
295
+ bindings.push(elem);
296
+ }
297
+ var childBindings = elem.getElementsByClassName('ng-binding');
298
+ for (var k = 0; k < childBindings.length; ++k) {
299
+ bindings.push(childBindings[k]);
300
+ }
301
+ }
302
+ }
303
+ }
304
+ for (var j = 0; j < bindings.length; ++j) {
305
+ var dataBinding = angular.element(bindings[j]).data('$binding');
306
+ if (dataBinding) {
307
+ var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
308
+ if (bindingName.indexOf(binding) != -1) {
309
+ matches.push(bindings[j]);
310
+ }
311
+ }
312
+ }
313
+ return matches;
314
+ }).apply(this, arguments); }
315
+ catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [baz in days, false, b, null, body]]
316
+ 16:17:18.892 INFO - Executing: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@9bad693c -> unknown locator]])
317
+ 16:17:18.943 INFO - Done: [get text: 0 [org.openqa.selenium.remote.RemoteWebElement@9bad693c -> unknown locator]]