【问题标题】:How do I make Protractor wait for a triggered promise to resolve?如何让量角器等待触发的承诺解决?
【发布时间】:2014-11-07 16:18:12
【问题描述】:

所以我有一个网站,点击一个按钮后,它会发送到一个角度服务,该服务做出承诺,解决它,获取一些数据,并在页面上显示该数据。我想要一个角度测试来找到按钮,单击它,并验证我是否获得了数据。但是,测试总是在按钮解析之前完成。我尝试了 browser.sleep(),但这只是暂停了事情,承诺从未得到解决。这里关于量角器的许多其他与 Promise 相关的问题都没有帮助,因为 Promise 不是在测试中设置的,而是由页面本身设置的。

这是我的测试:

it('should roll a d2', function () {
    element(by.id('d2Button')).click();

    //whatever has to be here for the waiting to occur

    expect(element(by.binding('rolls.d2')).getText()).not.toEqual('0');
});

这是 HTML:

<button id="d2Button" type="button" class="btn btn-success" ng-click="rollD2()">Roll</button>
<span><b>{{rolls.d2 | number}}</b></span>

这里简单总结一下点击时调用的角码:

$scope.rollD2 = function () {
    diceService.getD2Roll($scope.quantities.d2).then(function (data) {
        $scope.rolls.d2 = data.roll;
    });
};

这里是服务调用:

function getD2Roll(quantity) {
    var url = "Dice/D2/" + quantity;
    return getPromise(url);
}

function getPromise(url) {
    var deferred = $q.defer();
    $http.get(url).success(deferred.resolve).error(deferred.reject);
    return deferred.promise;
}

如何让测试正确等待?

【问题讨论】:

标签: javascript angularjs protractor angular-promise


【解决方案1】:

这里的答案是在单击按钮后使用内置的browser.waitForAngular() 功能。我为所有测试使用了一个通用方法,如下所示:

app.clickButtonAndWaitForResolution = function (button) {
    button.click();
    browser.waitForAngular();
};

然后任何需要点击触发 AJAX 调用的按钮的测试都会调用这个函数并传入要点击的按钮元素。

【讨论】:

  • 警告:“请注意,量角器会在每个 WebDriver 操作之前自动应用此命令。” angular.github.io/protractor/#/…
  • @dgtc - 对,但那是以前。这里的问题是它需要在 webdriver 命令之后发生 - 特别是如果接下来要运行的是 jasmine 断言
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2018-04-02
  • 2021-12-14
  • 2021-11-26
相关资源
最近更新 更多