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.
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]]