繁体   English   中英

在deferred.resolve中传递WebElement对象

[英]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.promiseWebdriver 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM