Skip to content
This repository was archived by the owner on Jul 29, 2024. It is now read-only.

Commit 50d6fde

Browse files
eduardombjuliemr
authored andcommitted
fix(clientSideScripts): bind-template directive shouldn't break bind locators
Fix "UnknownError: angular.element(...).data(...).$binding[0] is undefined" error raised when trying to use "by.binding" locator in any element of a page that contains at least one "bind-template" directive.
1 parent f8c606b commit 50d6fde

File tree

3 files changed

+27
-22
lines changed

3 files changed

+27
-22
lines changed

lib/clientsidescripts.js

+18-21
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,12 @@ clientSideScripts.findBindings = function() {
4141
var bindings = using.getElementsByClassName('ng-binding');
4242
var matches = [];
4343
for (var i = 0; i < bindings.length; ++i) {
44-
var elemData = angular.element(bindings[i]).data();
45-
if (!elemData || !elemData.$binding) {
46-
continue;
47-
}
48-
var bindingName = elemData.$binding[0].exp || elemData.$binding;
49-
if (bindingName.indexOf(binding) != -1) {
50-
matches.push(bindings[i]);
44+
var dataBinding = angular.element(bindings[i]).data('$binding');
45+
if(dataBinding) {
46+
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
47+
if (bindingName.indexOf(binding) != -1) {
48+
matches.push(bindings[i]);
49+
}
5150
}
5251
}
5352
return matches; // Return the whole array for webdriver.findElements.
@@ -150,13 +149,12 @@ clientSideScripts.findRepeaterElement = function() {
150149
bindings.push(childBindings[i]);
151150
}
152151
for (var i = 0; i < bindings.length; ++i) {
153-
var elemData = angular.element(bindings[i]).data();
154-
if (!elemData || !elemData.$binding) {
155-
continue;
156-
}
157-
var bindingName = elemData.$binding[0].exp || elemData.$binding;
158-
if (bindingName.indexOf(binding) != -1) {
159-
matches.push(bindings[i]);
152+
var dataBinding = angular.element(bindings[i]).data('$binding');
153+
if(dataBinding) {
154+
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
155+
if (bindingName.indexOf(binding) != -1) {
156+
matches.push(bindings[i]);
157+
}
160158
}
161159
}
162160
return matches;
@@ -199,13 +197,12 @@ clientSideScripts.findRepeaterColumn = function() {
199197
bindings.push(childBindings[k]);
200198
}
201199
for (var j = 0; j < bindings.length; ++j) {
202-
var elemData = angular.element(bindings[j]).data();
203-
if (!elemData || !elemData.$binding) {
204-
continue;
205-
}
206-
var bindingName = elemData.$binding[0].exp || elemData.$binding;
207-
if (bindingName.indexOf(binding) != -1) {
208-
matches.push(bindings[j]);
200+
var dataBinding = angular.element(bindings[j]).data('$binding');
201+
if(dataBinding) {
202+
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
203+
if (bindingName.indexOf(binding) != -1) {
204+
matches.push(bindings[j]);
205+
}
209206
}
210207
}
211208
}

spec/basic/findelements_spec.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,19 @@ describe('locators', function() {
1818
expect(greeting.getText()).toEqual('Hiya');
1919
});
2020

21-
it('should find an element by binding with ng-binding attribute',
21+
it('should find an element by binding with ng-bind attribute',
2222
function() {
2323
var name = element(by.binding('username'));
2424

2525
expect(name.getText()).toEqual('Anon');
2626
});
27+
28+
it('should find an element by binding with ng-bind-template attribute',
29+
function() {
30+
var name = element(by.binding('{{username|uppercase}}'));
31+
32+
expect(name.getText()).toEqual('ANON');
33+
});
2734
});
2835

2936
describe('by model', function() {

testapp/form/form.html

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<h4>Bindings</h4>
55
<span>{{greeting}}</span>
66
<span data-ng-bind="username"></span>
7+
<span data-ng-bind-template="{{username|uppercase}}"></span>
78
</div>
89

910
<div>

0 commit comments

Comments
 (0)