【问题标题】:How to structure Protractor promises如何构建量角器承诺
【发布时间】:2015-08-04 21:46:23
【问题描述】:

在这个例子中,我正在测试一个元素是否位于页面底部。我在 Protractor/Webdriver 中使用了 Promise,但我认为我用错了,因为我认为它不应该看起来如此混乱。

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. 所以看起来我不能使用这里解释的返回值:https://github.com/angular/protractor/blob/master/docs/control-flow.md

(我在实际测试中使用的是页面对象,所以变量没有示例中那么难看。)

【问题讨论】:

    标签: javascript selenium-webdriver promise protractor


    【解决方案1】:

    由于getSize()getLocation() 都返回承诺并且您需要实际值,因此您必须通过then() 显式解决所有承诺,或者让expect() 为您隐式执行此操作。

    我实际上将您的问题理解为 “如何在 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);
    });
    

    另见:

    【讨论】:

    • 我怎样才能让 expect() 解决承诺?我在第二个代码块中做错了什么,因为它解析为 undefined? promise.all() 似乎是一个很好的解决方案。
    • @KMK 用 expect 隐式解析承诺是我已经提到的,但这里不需要。而且,不幸的是,您无法从像 element(by.id('page')).getSize().height 这样的尚未解决的承诺中获取属性值。基本上,据我了解,您的问题是关于扁平化承诺链。我会用更多信息更新答案。敬请关注。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2014-08-08
    • 2019-07-07
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多