当前位置: 首页 > 面试题库 >

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

颛孙昆
2023-03-14
问题内容

我们有一个以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.evahtml" target="_blank">luate("!filterItem.isDivider");
    });
};

但是,测试只是挂直到jasmine.DEFAULT_TIMEOUT_INTERVAL在到达takewhile()呼叫。

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

使用量角器2.2.0。

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


问题答案:

也许我错过了一些东西,但是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();
        }
    });
}());


 类似资料:
  • 我有一个关于python中一些代码的问题。我试图在3个不同的列中满足条件TRUE时提取第一行的索引。这是我正在使用的数据: 只有当有3个“真”条件时,我才需要得到索引号: 非常感谢。

  • Q.while循环条件是作为一个整体进行计算,还是在决定是否进入循环之前一次计算一个条件?

  • 问题内容: 我必须从D / B检索一组列值并将其作为条件进行检查。 例如,我将有像字符串,在d / B柱。(值是一直比较的值)。我将在代码中声明一个变量值,我应该评估这种情况。 我怎样才能做到这一点??任何帮助都受到赞赏。谢谢。 问题答案: 这是使用标准(Java 1.6+)脚本库的示例:

  • 我想了解Selenium是如何评估页面的。 基于这个测试,PhantomJS如何评估页面是令人困惑的。我一直认为它会检查DOM,但对于元素文本,它会基于可见性进行评估!

  • 我在查询两个Oracle数据库时遇到问题。 查询是: (NULL实际上是一个参数,传递给查询,查询可能为空,所以我缩短了查询)。 在生产数据库上,它工作正常,响应为NULL。 在dev DB上,我发现了一个错误,即TRUNC不能应用于NUMBER,需要DATE(ORA-00932)。 显然,生产数据库跳过了OR之后条件中的所有内容,开发人员执行OR之后的部分。 我确实知道通过将CAST(MY_PA

  • cmf_get_file_extension($filename) 功能 获取文件扩展名 参数 $filename: string 文件名 返回 string 文件扩展名