我使用自动化测试框架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');
}
});
答案 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');
}
})