在这个例子中,我正在测试元素是否位于页面底部。我正在使用Protractor / Webdriver中的承诺,但我认为我使用它是错误的,因为我不认为它应该看起来很混乱。
describe('Element', function(){
it('should be placed at bottom', function(){
element(by.id('page').getSize().then(function(dimP){
element(by.id('element').getLocation().then(function(locE){
element(by.id('element').getSize().then(function(dimE){
expect(locE.y + dimE.height).toEqual(dimP.height);
})
});
});
})
});
我怎样才能以更干净的方式做到这一点?我正在使用Protractor 2.1.0版。
我试过这样做:
expect(element(by.id('page').getSize().height).toEqual(1000);
但是它说预期未定义为等于1000。所以看起来我不能使用返回值,如下所述:https://github.com/angular/protractor/blob/master/docs/control-flow.md
(我在实际测试中使用了一个页面对象,因此变量并不像示例中那样丑陋。)
答案 0 :(得分:3)
由于getSize()
和getLocation()
都返回了承诺并且您需要实际值,因此您必须使用then()
明确解析所有承诺,或者隐式地让expect()
为你做这件事。
我实际上是在理解你的问题“如何在Protractor中压扁承诺链?”。这是promise.all()
有助于一次解决多个promise,这将使您免于编写多个嵌套then()
回调:
var elm = element(by.id('element')),
page = element(by.id('page'));
var promises = [elm.getSize(), elm.getLocation(), page.getSize()];
protractor.promise.all(promises).then(function (values) {
expect(values[0].height + values[1].y).toEqual(values[2].height);
});
另见: