javascript - 在 Protractor 中传播 promise

标签 javascript angularjs selenium-webdriver promise protractor

q library有这个巧妙的功能来解决多个 promise 并将其传播到单独的参数中:

If you have a promise for an array, you can use spread as a replacement for then. The spread function “spreads” the values over the arguments of the fulfillment handler.

return getUsername()
    .then(function (username) {
        return [username, getUser(username)];
    })
    .spread(function (username, user) {

    });

在 Protractor 中,我们尝试使用内置的 protractor.promise来自 WebDriverJS

问题:

是否可以使用 protractor.promise 实现“传播”功能?

示例用例:

我们已经为 check if an element is focused 实现了自定义 jasmine 匹配器.这里我们需要先解决两个promise,然后再进行相等比较。目前,我们正在使用 protractor.promise.all()then():

protractor.promise.all([
    elm.getId(),
    browser.driver.switchTo().activeElement().getId()
]).then(function (values) {
    jasmine.matchersUtil.equals(values[0], values[1]);
});

理想情况下,我们希望它处于更具可读性的状态:

protractor.promise.all([
    elm.getId(),
    browser.driver.switchTo().activeElement().getId()
]).spread(function (currentElementID, activeElementID) {
    return jasmine.matchersUtil.equals(currentElementID, activeElementID);
})

最佳答案

使用起来可能有点难看,但是你可以定义一个独立的辅助函数,它可以作为参数传递给then()并且有一个回调,通常传递给then() 传递给它。然后,此函数会将数组值转换为函数参数:

protractor.promise.all([
    elm.getId(),
    browser.driver.switchTo().activeElement().getId()
]).then(spread(function (currentElementID, activeElementID) {
    // ---^^^----- use helper function to spread args
    jasmine.matchersUtil.equals(currentElementID, activeElementID);
}));


// helper function gets a callback
function spread(callback) {
    // and returns a new function which will be used by `then()`
    return function (array) {
        // with a result of calling callback via apply to spread array values
        return callback.apply(null, array);
    };
}

您仍然可以将它与另一个 then() 链接起来并提供拒绝回调;它保持 Protractor promise 的所有行为相同,但只是将值数组转换为参数。

缺点是它不像您的示例那样完美(不是 .all().spread() 而是 .all().then(spread()) ),您可能必须为此助手创建一个模块或全局定义它,以便能够在多个测试文件中轻松使用它。

更新:

在 ES2015 中可以使用 destructuring assignment连同then():

protractor.promise.all([
    elm.getId(),
    browser.driver.switchTo().activeElement().getId()
]).then(function (values) {
    // Destructure values to separate variables
    const [currentElementID, activeElementID] = values; 
    jasmine.matchersUtil.equals(currentElementID, activeElementID);
}));

关于javascript - 在 Protractor 中传播 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31887795/

相关文章:

javascript - 如何操作Google-Tasks添加的节点?

javascript - AngularJS 和 FancyTree : Events firing, 但具有未定义的参数

java - 'Selenium-server-standalone.jar' 和 'Selenium Client & WebDriver' 有什么区别?

javascript - 尝试使用 js-cookies 设置表单输入值

Javascript 获取当前页面并根据 URL 将类添加到元素

javascript - 无法增加/减少Vue中的数据属性值

java - 基于用户输入的下拉菜单

javascript - 迭代一个对象以查找哪些是缺失的数字并为其分配一个值

javascript - 了解 ng-table 演示中的延迟排序示例

java - 如何使用 Java 在 Selenium WebDriver 的隐藏字段中键入一些文本