一尘不染

在条件评估为真时获取元素(扩展ElementArrayFinder)

selenium

我们有一个以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()功能(受Python启发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()呼叫。

如果将console.logs放入循环中和之后,我可以看到它正确地将元素推到分隔符之前,并在到达分隔符时停止。我可能在这里错过了一些东西。

使用量角器2.2.0。


另外,让我知道我是否使问题复杂化了。


阅读 225

收藏
2020-06-26

共1个答案

一尘不染

也许我错过了一些东西,但是ul li a当它们从getText()给您一些东西时,您是否不能只遍历这些元素,然后将它们存储到某个数组中,或者直接在该循环中对其进行某些处理呢?

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();
        }
    });
}());
2020-06-26