在Protractor中获取元素属性值

时间:2016-01-23 08:15:50

标签: javascript testing callback protractor

我正在编写一个必须等​​待元素属性具有非空值的量角器测试,然后我想将该值返回给调用函数。事实证明这比我预期的要难得多!

我能够正确地安排一个browser.wait()命令来等待element属性具有非空值,并且我已经验证了这个值实际上是我期望进入回调函数的内容,但由于某种原因,我无法在回调函数之外将其返回到测试代码的其余部分。

以下是我的代码的样子:

function test() {
    var item = getItem();
    console.log(item);
}

function getItem() {
    var item;
    browser.wait(function() {
        return element(by.id('element-id')).getAttribute('attribute-name').then(function(value) {
            item = value;
            // console.log(item);
            return value !== '';
        });
    });
    return item;
}

我可以告诉我执行的顺序并不像我预期的那样,因为当我取消注释回调函数中的console.log()调用时,我看到打印出的预期值。但是,test()功能中的同一个调用会打印' undefined'。

这里发生了什么?我错过了什么?如何正确地从回调函数中获取属性值?

感谢您的帮助。

2 个答案:

答案 0 :(得分:11)

我不会将wait和getting属性部分组合在一起 - 逻辑上这些是两个不同的东西,将它们分开

browser.wait(function() {
    return element(by.id('element-id')).getAttribute("attribute").then(function(value) {
        item = value;
        // console.log(item);
        return value !== '';
    });
});

element(by.id('element-id')).getAttribute("attribute").then(function (value) {
    console.log(value);
});

请注意,您可以通过以下方式简化等待条件:

var EC = protractor.ExpectedConditions;
var elm = $('#element-id[attribute="expected value"]');

browser.wait(EC.presenceOf(elm), 5000);
elm.getAttribute("attribute").then(function (value) {
    console.log(value);
});

仅供参考,您可能已使用deferred解决了当前的问题:

function test() {
    getItem().then(function (value) {
        console.log(value);
    });
}

function getItem() {
    var item = protractor.promise.defer();
    browser.wait(function() {
        return element(by.id('element-id')).getAttribute('attribute').then(function(value) {
            var result = value !== '';
            if (result) {
                item.fulfill(value);
            }
            return result;
        });
    });
    return item.promise;
}

答案 1 :(得分:1)

在做了一些关于量角器如何使用promises和schedule / /将它们与控制流程一起使用的阅读之后,我发现了一个更简单的解决方案,接近第一个解决方案@alecxe提供的。在这里:

function test() {
  var item = getItem().then(function(item) {
    console.log(item);
  });
}

function getItem() {
  return browser.wait(function() {
    return element(by.id('element-id')).getAttribute('attribute-name').then(function(value) {
      return value;
    });
  });
}

由于browser.wait()返回一个promise本身,它可以与调用者内部的另一个then()链接,这样就可以保证正确的执行顺序。