在量角器测试中同步处理

时间:2015-01-06 13:13:45

标签: angularjs protractor

我正在尝试编写我认为在量角器中相当简单的测试,但似乎在您尝试同步执行任何操作的那一刻,Protractor会让您的生活变得艰难!通常,处理定位器函数(返回promise)不是问题,因为任何expect语句都会在测试断言之前自动解析传递给它的任何promise语句。但是,我正在尝试做的是在expect语句之前解析这些定位器promise,这样我就可以有条件地执行一些测试逻辑。考虑(伪代码):

// Imagine I have a number of possible elements on the page
// and I wish to know which are on the page before continuing with a test.

forEach(elementImLookingFor){
  if (elementImLookingFor.isPresent) {
    // record the fact that the element is (or isnt) present
  }
}

// Now do something for the elements that were not found

但是,在上面的示例中,'isPresent'调用返回一个promise,因此实际上无法以这种方式调用。将其称为承诺(即使用then)意味着我的forEach块在我记录之前退出,如果该元素存在于页面上。

关于如何解决这个问题,我有空白,有没有人遇到过类似的事情?

2 个答案:

答案 0 :(得分:1)

我已使用bluebird执行以下操作;

it('element should be present', function(done)
  Promise.cast(elementImLookingFor.isPresent)
    .then(function(present){
      expect(present).toBeTruthy();
    })
    .nodeify(done);
});

如果您想要检查isPresent上的一些元素,则应该可以执行以下操作;

it('check all elements are present', function(done){
  var promises = [element1, element2].map(function(elm){
    return elm.isPresent();
  });

  // wait until all promises resolve
  Promise.all(promises)
    .then(function(presentValues){
      // check that all resolved values is true
      expect(presentValues.every(function(present){
        return present;
      })).toBeTruthy(); 

    })
    .nodeify(done);
});

希望这有帮助

答案 1 :(得分:0)

所以elementImLookingFor是由element.all返回的承诺,我推测?或者,如量角器文档中所述,ElementArrayFinder。您可以在其上调用方法.each()并向其传递expect项内容的函数。