【问题标题】:Promises inside for loopsfor 循环中的 Promise
【发布时间】:2015-01-06 09:52:36
【问题描述】:

我正在为此苦苦挣扎:

  • 点击按钮获取一组数据
  • 检查返回的行数是否符合我的预期
  • 我需要运行 10 次,每次我期望的行数不同

下面的代码 sn-p 不起作用,因为 'i' 不是我所期望的。我怎样才能做到这一点?

for (var i = 0; i < subElements.length; ++i) {
    element(by.id('get-data')).click();

    // Check users returned
    element.all(by.id('users')).map(function (elm) {
        return elm;
    }).then(function (users) {
        expect(users.length).toBe(expectedRecords[i]);
        // Some more checks to be added later
    });
}

【问题讨论】:

  • 什么是subElements?你能显示相关的HTML代码吗?我认为这可以用量角器风格以不同的方式解决:)
  • 我通过创建一个辅助函数解决了这个问题。在主函数中,我通过 for 循环运行,调用辅助函数。辅助函数进行检查。不要这是一种干净的方式,所以我没有发布,但它现在正在工作。

标签: promise protractor


【解决方案1】:

怎么样:

for (var i = 0; i < subElements.length; ++i) {
    element(by.id('get-data')).click();

    var count = element.all(by.id('users')).count();
    expect(count).toBe(expectedRecords[i]);
}

只要您不在then 中访问i,它就会是您想要的,否则i 将是您循环中的最后一个值,您需要关闭。

编辑:见Using protractor with loops

【讨论】:

    【解决方案2】:

    使用蓝鸟

    var Promise = require('bluebird');
    
    it('my test', function(done){
      var promises = subElements.map(function(subElm, i){
        return element(by.id('get-data')).click()
          .then(function(){
            // Check users returned
            return element.all(by.id('users')).map(function (elm) {
              return elm;
            })
          })
          .then(function(users) {
            expect(users.length).toBe(expectedRecords[i]);
          });
      });
    
      Promise.all(promises).nodeify(done);
    })
    

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2022-10-16
      • 2019-08-21
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      相关资源
      最近更新 更多