This repository was archived by the owner on Jul 29, 2024. It is now read-only.
This repository was archived by the owner on Jul 29, 2024. It is now read-only.
Add takewhile() method to ElementArrayFinder #2521
Open
Description
The current fp toolset available on ElementArrayFinder
is great, but, what if we continue to improve it?
For instance, recently I've needed a "take while" functionality which cannot be simply achieved with filter()
. I needed to take elements until I hit a certain one - in my case it was a menu and I wanted to get all of the elements before a divider which had an empty text.
Currently, I've added the following to onPrepare()
:
protractor.ElementArrayFinder.prototype.takewhile = function(whileFn) {
var self = this;
var getWebElements = function() {
return self.getWebElements().then(function(parentWebElements) {
var list = [];
parentWebElements.forEach(function(parentWebElement, index) {
var elementFinder =
protractor.ElementFinder.fromWebElement_(self.ptor_, parentWebElement, self.locator_);
list.push(whileFn(elementFinder, index));
});
return protractor.promise.all(list).then(function(resolvedList) {
var filteredElementList = [];
for (var index = 0; index < resolvedList.length; index++) {
if (!resolvedList[index]) {
break;
}
filteredElementList.push(parentWebElements[index])
}
return filteredElementList;
});
});
};
return new protractor.ElementArrayFinder(this.ptor_, getWebElements, this.locator_);
};
Example usage:
element.all(by.css("ul li a")).takewhile(function (elm) {
return elm.getText().then(function (text) {
return text;
});
});
Would it make sense to make takewhile
built-in? Thanks.