javascript - 在 Protractor 中获取元素属性值

标签 javascript testing callback protractor

我正在编写一个 Protractor 测试,它必须等待元素属性具有非空值,然后我想将该值返回给调用函数。事实证明这比我想象的更难写!

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

这是我的代码的样子:

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”。

这是怎么回事?我错过了什么?如何从回调函数中正确获取属性值?

感谢您的帮助。

最佳答案

我不会合并等待和获取属性部分 - 从逻辑上讲,它们是两个独立的部分,将它们分开:

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;
}

关于javascript - 在 Protractor 中获取元素属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34961197/

相关文章:

javascript - Bash中的JavaScript解释器

javascript - 仅从下拉列表中获取选定的值并从下拉列表中删除未选定的值

javascript - 尽管 MFP 服务器已关闭,但仍返回访问 token

javascript - 使用 JavaScript 解析 CSS 样式 marginLeft

javascript - 从 JavaScript 使用参数调用 Controller 操作是否安全?

java - 如何使用 JUnit 测试这个类?

python - 如何将自定义 nose 插件添加到 `nosetests` 命令

http - 用户存在时服务器返回 400

javascript - 如何强制函数连续执行?

scala - 在 akka actor 中使用 future 回调