了解量角器对承诺的使用

时间:2014-11-17 10:34:42

标签: javascript protractor

基本上我正在玩一个用于设置前置条件的库(想想用户创建)。由于量角器是基于承诺的magically does all the wrapping to keep things in order,我想到了为此目的使用承诺。我写了一些示例代码,但我无法解释观察到的行为,所以也许有人可以帮我理解发生了什么。

function timeout(ms) {
    var promise = protractor.promise.defer();
    setTimeout(function() {
        console.log('qwer');
        promise.fulfill(true);
    }, ms);
    return promise.promise;
}

所以现在函数返回一个promise,我假设它可以内联使用(因为所有代码都应该包含在控制流中)

describe('test', function() {
  it('bla', function() {
    browser.get('/');
    timeout(5000);
    $('some-element').click();
  });
});

但是这不能按预期工作(即console.log永远不会发生)。即使expect来自该承诺的结果,它也不会改变结果。如果通过执行timeout(5000).then(done)实际显式等待完成,则超时完成,但是下一个操作在该操作之后没有排队(即站点被打开,元素被点击,然后5秒后超时的日志发生)。 / p>

所以我真的很困惑如何使用控制流来确保所有内容按顺序执行并且观察到的行为相互配合。

1 个答案:

答案 0 :(得分:4)

仅仅创建一个protractor.promise延迟对象还不够 - 您需要告诉控制流程。这通常使用protractor.promise.controlFlow().execute()完成。

function timeout(ms) {
  protractor.promise.controlFlow().execute(function() {
    var deferred = protractor.promise.defer();
    setTimeout(function() {
      console.log('qwer');
      deferred.fulfill(true);
    }, ms);
    return deferred.promise;
  });
}

通过https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js阅读这里幕后的所有魔法。