如何构建量角器承诺

时间:2015-08-04 11:58:36

标签: javascript selenium-webdriver promise protractor

在这个例子中,我正在测试元素是否位于页面底部。我正在使用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

(我在实际测试中使用了一个页面对象,因此变量并不像示例中那样丑陋。)

1 个答案:

答案 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);
});

另见: