我们有一个以ul->li列表形式表示的菜单(简化):
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链接的文本来识别分隔符(如果使用分隔符,则为空)。
filterItem.isDivider
a
现在,目标是获取位于分隔线之前的所有菜单项。您将如何解决这个问题?
我当前的方法相当通用- 扩展ElementArrayFinder和添加takewhile()功能(受Python启发itertools.takewhile())。这是我如何实现它(基于filter()):
ElementArrayFinder
takewhile()
itertools.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()呼叫。
jasmine.DEFAULT_TIMEOUT_INTERVAL
如果将console.logs放入循环中和之后,我可以看到它正确地将元素推到分隔符之前,并在到达分隔符时停止。我可能在这里错过了一些东西。
console.log
使用量角器2.2.0。
另外,让我知道我是否使问题复杂化了。
也许我错过了一些东西,但是ul li a当它们从getText()给您一些东西时,您是否不能只遍历这些元素,然后将它们存储到某个数组中,或者直接在该循环中对其进行某些处理呢?
ul li a
var i = 0; var el = element.all(by.css('ul li a')); var tableItems = []; (function loop() { el.get(i).getText().then(function(text){ if(text){ tableItems.push(el.get(i)); i+=1; loop(); } }); }());