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

Commit 98f4ba5

Browse files
committed
Merge pull request #812 from hankduan/exactBinding
feat(locators): Add By.exactBinding locator
2 parents cbcdb48 + 65844fb commit 98f4ba5

File tree

3 files changed

+45
-4
lines changed

3 files changed

+45
-4
lines changed

lib/clientsidescripts.js

+12-3
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,30 @@ clientSideScripts.waitForAngular = function(selector, callback) {
3737
* Find a list of elements in the page by their angular binding.
3838
*
3939
* @param {string} binding The binding, e.g. {{cat.name}}.
40+
* @param {boolean} exactMatch Whether the binding needs to be matched exactly
4041
* @param {Element} using The scope of the search.
4142
*
4243
* @return {Array.<Element>} The elements containing the binding.
4344
*/
44-
clientSideScripts.findBindings = function(binding, using) {
45+
clientSideScripts.findBindings = function(binding, exactMatch, using) {
4546
using = using || document;
4647
var bindings = using.getElementsByClassName('ng-binding');
4748
var matches = [];
4849
for (var i = 0; i < bindings.length; ++i) {
4950
var dataBinding = angular.element(bindings[i]).data('$binding');
5051
if(dataBinding) {
5152
var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
52-
if (bindingName.indexOf(binding) != -1) {
53-
matches.push(bindings[i]);
53+
if (exactMatch) {
54+
var matcher = new RegExp('([^a-zA-Z\d]|$)' + binding + '([^a-zA-Z\d]|^)');
55+
if (matcher.test(bindingName)) {
56+
matches.push(bindings[i]);
57+
}
58+
} else {
59+
if (bindingName.indexOf(binding) != -1) {
60+
matches.push(bindings[i]);
61+
}
5462
}
63+
5564
}
5665
}
5766
return matches; /* Return the whole array for webdriver.findElements. */

lib/locators.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,32 @@ ProtractorBy.prototype.binding = function(bindingDescriptor) {
9393
findElementsOverride: function(driver, using) {
9494
return driver.findElements(
9595
webdriver.By.js(clientSideScripts.findBindings,
96-
bindingDescriptor, using));
96+
bindingDescriptor, false, using));
9797
},
9898
message: 'by.binding("' + bindingDescriptor + '")'
9999
};
100100
};
101101

102+
/**
103+
* Find an element by exact binding.
104+
*
105+
* @alias by.exactBinding()
106+
* Same as by.binding() except this does not allow for partial matches
107+
*
108+
* @param {string} bindingDescriptor
109+
* @return {{findElementsOverride: findElementsOverride, message: string}}
110+
*/
111+
ProtractorBy.prototype.exactBinding = function(bindingDescriptor) {
112+
return {
113+
findElementsOverride: function(driver, using) {
114+
return driver.findElements(
115+
webdriver.By.js(clientSideScripts.findBindings,
116+
bindingDescriptor, true, using));
117+
},
118+
message: 'by.exactBinding("' + bindingDescriptor + '")'
119+
};
120+
};
121+
102122
/**
103123
* @deprecated Use 'model' instead.
104124
*

spec/basic/findelements_spec.js

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

21+
it('should find exact match by exactBinding', function() {
22+
var greeting = element(by.exactBinding('greeting'));
23+
24+
expect(greeting.getText()).toEqual('Hiya');
25+
});
26+
27+
it('should not find partial match by exactBinding', function() {
28+
var greeting = element(by.exactBinding('greet'));
29+
30+
expect(greeting.isPresent()).toBe(false);
31+
});
32+
2133
it('should find an element by binding with ng-bind attribute',
2234
function() {
2335
var name = element(by.binding('username'));

0 commit comments

Comments
 (0)