[英]Passing WebElement object in deferred.resolve
下面的代码查找带有量角器的webElement(身份验证按钮),并尝试使用该元素作为参数来解析promise。
function someFunc() {
var deferred = q.defer();
browser.findElement(by.css('[data-aid="buttons.authenticate"]')).then(
function(e) {
console.log('element found: ' + e);
deferred.resolve(e);
}
);
return deferred.promise;
}
someFunc().then(
function(elem) {
console.log('got elem ' + elem);
elem.click();
}
);
输出: element found: [object Object]
因此,永远不会调用then函数。 当我用其他一些值(int,字符串,数组,映射)替换resolve()时,它可以正常工作。 那为什么我不能返回WebElement对象呢?
谢谢
要实际执行您要问的事情,我怀疑您应该使用暴露为protractor.promise
的Webdriver Promise API q
代替q
。
var deferred = protractor.promise.defer();
它使用一个fulfill
功能而不resolve
:
deferred.fulfill(e);
然而...
如果通过defer
创建承诺只是为了对一个或多个现有承诺做某事,那么通常这就是您没有使用承诺链或可用的API函数的迹象。 可以通过返回a)您要从then
回调中解析的内容以及b)返回then
函数的结果来完成链接:
function someFunc() {
return browser.findElement(by.css('[data-aid="buttons.authenticate"]')).then(function(e) {
console.log('element found: ' + e);
return e;
});
}
someFunc().then(function(elem) {
console.log('got elem ' + elem);
elem.click();
});
但是由于在此示例中,您正好返回诺言的已兑现值,因此可以进一步简化此操作:
function someFunc() {
return browser.findElement(by.css('[data-aid="buttons.authenticate"]'));
}
someFunc().then(function(elem) {
console.log('got elem ' + elem);
elem.click();
});
而且,由于click
实际上是在findElement
的promise结果上findElement
,因此可以进一步简化为
browser.findElement(by.css('[data-aid="buttons.authenticate"]').click();
您在评论中说您不能做上述事情,因为您想“兑现”承诺。 目前尚不清楚这意味着什么,但是说您想拥有2个可用的元素以便对它们进行处理,可以使用protractor.promise.all
,而不是通过defer
手动创建诺言:
var button1 = browser.findElement(by.css('[data-aid="buttons.authenticate"]');
var button2 = browser.findElement(by.css('[data-aid="buttons.confirm"]');
protractor.promise.all([button1, button2]).then(function(buttons) {
var button1 = buttons[0];
var button2 = buttons[1];
// Do something with both buttons
});
Webdriver的Promise API还提供了其他功能,可以通过多种方式操纵承诺。 我认为“ map”和“ filter”是我使用过的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.