【问题标题】:How to wait for element.all().each() to resolve before proceeding如何在继续之前等待 element.all().each() 解决
【发布时间】:2015-11-18 21:04:13
【问题描述】:

我正在尝试遍历元素列表以查找其中是否有任何一个具有特定值,因为它是 getText() 值。

我的问题是我的测试没有按照我设定的顺序执行。

我读过一堆关于排队和承诺解决的文章,但我不明白它如何影响我当前的场景。

这是我正在做的事情:

it('should find apps by name', function() {
    var exists = false;

    element.all(by.repeater(‘item in list’).each(function(elem) {
        elem.getText().then(function(text) {
            if(text == 'foo') 
                exists = true;
            return exists;
        }).then(function(exists) {
            console.log('interim value: ' + exists);  // This appears after
        });
    });

    console.log('final status: ' + exists);   // This appears in the console first
})

任何关于我如何确定我希望布尔值的值是什么的见解我最后记录它之前将不胜感激。

【问题讨论】:

    标签: javascript selenium promise protractor end-to-end


    【解决方案1】:

    量角器是异步的——一切都是一个承诺,由Control Flow控制:

    WebDriverJS(以及 Protractor)API 完全是异步的。全部 函数返回承诺。

    WebDriverJS 维护一个待处理的 Promise 队列,称为控件 流,以保持执行有条理。

    换句话说,不要期望代码从上到下工作。

    由于您需要一个布尔值来指示存在所需的元素 - each() 不是一个好的选择 - 它只会对每个元素应用一个函数。请改用reduce()

    var exists = element.all(by.repeater("item in list")).reduce(function(acc, elem) {
        return elem.getText().then(function(text) {
            return !acc ? text === 'foo' : acc;
        });
    }, false);
    

    【讨论】:

    • 谢谢。这很有帮助。
    • 肯定在第一次迭代之后,acc 将是一个承诺,而不是一个布尔值。
    • 并且扫描操作需要修复。就目前而言,第二个“foo”会将布尔值恢复为false
    • @Roamer-1888 acc 在迭代期间始终保持布尔值。但是,修复了扫描操作,感谢您的指点。
    • 有趣的是,我运行了一个(公认的修改版本)你的脚本,它证实了我的印象,即从 reduce 回调返回一个 thenable 会导致下一次迭代的previous(即acc)成为一个承诺。我看不出它可能是其他情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多