有条件地解决承诺

时间:2017-09-08 18:39:15

标签: javascript protractor

我使用自动化测试框架Protractor。

我发现Protractor经常使用promises来异步解析代码评估。

问题:一旦满足条件,如何手动解析对特定值的承诺?

更新:09/08/2017

抱歉,promises我有点不清楚。我现在能够正确地使用:

// match variable
var match = false;

// get all elements with `div` tag
var scanElements = element.all(by.css('div')).each(function(el) {
    // get text content of element
    el.getText().then(function(text) {
        // split words into array based on (space) delimeter
        var sp = text.split(' ');
        for (var i = 0; i < sp.length; i++) {
            if (sp[i] == 'Stack Overflow') {
                match = true;
            }
        }
    });
});

// on complete
scanElements.then(function() {
    if (match) {
        console.log('Status: Found match!');
    }
    else {
        console.log('Status: No match');
    }
});

3 个答案:

答案 0 :(得分:1)

根据documentation元素的返回类型,这里没有问题.all()在遍历所有内容后为null。

  

在所有ElementFinder上调用函数时将解析的promise。承诺将解除为null。

编辑1: 过滤器是否是有效选项?

element.all(by.css('div'))
    .filter(function(element) {
       return element.getText().then(function(text) {
         var sp = text.split(' ');
         for ( var i =0; i< sp.length; i++) {
           if(sp[0] == 'protractor') return true;
         }
         return false;
       });
     }).first();

首先filter然后返回匹配

first元素

答案 1 :(得分:1)

您应该使用map代替each。如果您查看源代码,这就是each的实现方式:

each(fn: (elementFinder?: ElementFinder, index?: number) => any): wdpromise.Promise<any> {
  return this.map(fn).then((): any => {
    return null;
  });
}

因此,您可以看到它在内部使用map并通过返回null来隐藏结果。它也在documentation中指出。

还要将element重命名为其他内容,以避免与量角器的element对象产生歧义。

答案 2 :(得分:0)

在您的确切示例中,您可以在ElementArrayFinder上使用.getText() -

// calling .getText() exactly on ElementArrayFinder returns promise
let hasStackOverflow = $$('div').getText().then(texts=> {
    // texts would be array of strings
    return texts.includes('Your Text exact match')
})

hasStackOverflow.then(has=> {
    if (has) {
        console.log('Status: Found match!');
    }
    else {
        console.log('Status: No match');
    }
})