Взять элементы, пока условие оценивается как true (расширяя ElementArrayFinder)
У нас есть меню в видеul->li
список (упрощенный):
<ul class="dropdown-menu" role="menu">
<li ng-repeat="filterItem in filterCtrl.filterPanelCfg track by filterItem.name"
ng-class="{'divider': filterItem.isDivider}" class="ng-scope">
<a href="" class="ng-binding"> Menu Item 1</a>
</li>
...
<li ng-repeat="filterItem in filterCtrl.filterPanelCfg track by filterItem.name"
ng-class="{'divider': filterItem.isDivider}" class="ng-scope">
<a href="" class="ng-binding"> Menu Item 2</a>
</li>
</ul>
Где где-то в положении N находится разделитель, который можно определить пооценки filterItem.isDivider
или проверив текстa
ссылка (в случае делителя, она пуста).
Теперь цель состоит в том, чтобы получить все пункты меню, которые расположены перед разделителем. Как бы вы подошли к проблеме?
Мой нынешний подход довольно общий - расширитьElementArrayFinder
и добавитьtakewhile()
функция (вдохновленный Pythonitertools.takewhile()
). Вот как я это реализовал (на основеfilter()
):
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_);
};
И вот как я использую это:
this.getInclusionFilters = function () {
return element.all(by.css("ul.dropdown-menu li")).takewhile(function (inclusionFilter) {
return inclusionFilter.evaluate("!filterItem.isDivider");
});
};
Но тест просто висит, покаjasmine.DEFAULT_TIMEOUT_INTERVAL
достигается наtakewhile()
вызов.
Если я поставлюconsole.log
Находясь в цикле и после, я вижу, что он правильно помещает элементы перед разделителем и останавливается, когда достигает его. Я мог бы что-то здесь упустить.
Использование транспортира 2.2.0.
Кроме того, дайте мне знать, если я слишком усложняю проблему.