如何构建量角器承诺
How to structure Protractor promises
在此示例中,我正在测试某个元素是否位于页面底部。我在 Protractor/Webdriver 中使用了 promises,但我认为我用错了,因为我认为它不应该看起来这么乱。
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);
但它说 Expected undefined to equal 1000. 所以我似乎不能使用 return 值,如下所述:https://github.com/angular/protractor/blob/master/docs/control-flow.md
(我在实际测试中使用的是页面对象,所以变量并没有示例中那么丑陋。)
由于 getSize()
和 getLocation()
都 return promises 而你需要实际值,你必须解决所有的 promises,或者明确地使用 then()
,或者让expect()
隐含地为你做这件事。
我实际上将你的问题理解为 "How to flatten a promise chain in Protractor?"。这是 promise.all()
将有助于一次解决多个承诺,这将使您免于编写多个嵌套 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);
});
另请参阅:
- Flattening Promise Chains
- How do I reference a promise returned from a chained function?
在此示例中,我正在测试某个元素是否位于页面底部。我在 Protractor/Webdriver 中使用了 promises,但我认为我用错了,因为我认为它不应该看起来这么乱。
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);
但它说 Expected undefined to equal 1000. 所以我似乎不能使用 return 值,如下所述:https://github.com/angular/protractor/blob/master/docs/control-flow.md
(我在实际测试中使用的是页面对象,所以变量并没有示例中那么丑陋。)
由于 getSize()
和 getLocation()
都 return promises 而你需要实际值,你必须解决所有的 promises,或者明确地使用 then()
,或者让expect()
隐含地为你做这件事。
我实际上将你的问题理解为 "How to flatten a promise chain in Protractor?"。这是 promise.all()
将有助于一次解决多个承诺,这将使您免于编写多个嵌套 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);
});
另请参阅:
- Flattening Promise Chains
- How do I reference a promise returned from a chained function?