javascript - 使用 Webdriver 从嵌套 promise 返回值

标签 javascript selenium promise mocha.js

在我的测试代码中,我希望实现以下目标:

it('Updates label text', function(done) {
   page.testLabelText();
   assert.equal(page.testLabelText().pageLabel, page.testLabelText().iFrameLabel);
   done();
});

在我的页面对象中,这里是 testLabelText();:

page.testLabelText = function () {
    var pageLabel = function () {
        return driver.findElement(By.css('#element')).getText().then(function(text) {
            return text;
        });
    };
    var iFrameLabel = function () {
        return driver.findElement(By.css('#element')).getText().then(function(text) {
            return text;
        });
    };
    return {
        pageLabel: pageLabel(),
        iFrameLabel: iFrameLabel()
    };
};

但是当打印到控制台时这会返回“未定义”...我是 javascript 的新手所以虽然我已经在常规 javascript 中管理它,但我尝试的一切都失败了 selenium WebdriverJS promises...

最佳答案

您的 assert.equal() 正在比较两个不同的 promise 对象,因此永远不会为真。要了解原因,请按以下步骤进行操作。您需要做的是在解决后从两个 promise 中获取值,然后比较这些值。

page.testLabelText(); 本身只返回一个对象,因此在不分配返回值或引用返回值的情况下自行调用它不会执行任何操作。

page.testLabelText().pageLabel 本身就是一个 promise 。

page.testLabelText().iFrameLabel 本身就是一个 promise 。

而且,它们是不同的 promise 对象,因此您的 assert.equal() 不会为真。

如果你想比较 promise 的两个值,你必须这样做:

var obj = page.testLabelText();
Promise.all(obj.pageLabel, obj.iFrameLabel).then(function(results) {
    assert.equal(results[0], results[1]);
    done();
});

关于javascript - 使用 Webdriver 从嵌套 promise 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41053887/

相关文章:

ruby - 阻止或重定向请求到 Selenium 中的特定路径或域

selenium - 如何使用 selenium webdriver 进行强制页面刷新?

javascript - 使用 NODE JS 和 BLUEBIRD 从 REDIS 中获取数据

javascript - 如何在 Javascript 中执行非阻塞调用? ( promise 不会那样做。)

javascript - 任意类型的函数调用

javascript - 测试中的 NestJS 全局模块

python-3.x - python 中的 Selenium 网络抓取无法读取元素的.text

javascript - 如何读取 pm api sendRequest 生成的流响应

javascript - 延迟加载不起作用,不显示图像?

javascript - 如何在 node.js 中同步函数和 promises