【问题标题】:How do I return a promise before protractor expect runs?如何在量角器期望运行之前返回承诺?
【发布时间】:2016-04-25 13:10:28
【问题描述】:
Person.prototype.checkAssignmentIncomplete = Person.chain(function (data) {
var self = this;

var assignmentPane = self.browser.element(by.id(data.testId + '#' + data.deadline));
expect(assignmentPane.isPresent()).toBe(true);

assignmentPane.click();
self.browser.waitForAngular();

var foundName = false;
var promises = [];
element.all(by.binding('member.user.fullname')).each(function (nameColumn) {
    var row = nameColumn.element(by.xpath('..'));
    var promise = nameColumn.getText().then(function (name) {
        foundName = foundName || data.name === name;
        if (foundName) {
            var reviewButton = row.element(by.className('icon'));
            expect(reviewButton.isPresent()).toBe(false);
        }
    });
    promises.push(promise);
});

q.all(promises).then(function () {
    expect(foundName).toBe(true);
});

});

我在 Protractor 中的自动化测试遇到问题,似乎认为 foundName 是假的,我知道一个事实,当它运行时它确实是真的。我的结论是期望函数在承诺完成之前运行。

我想知道如何在我检查期望函数中的 foundName 之前确保承诺已经完成?

【问题讨论】:

  • 要解决你需要明确运行$scope.$digest()的承诺
  • 感谢您的回答,但我们不能在量角器测试中使用范围。
  • all/each 是异步的,对吧?
  • 你的规范看起来很乱,我建议使用it 块来帮助控制流。但是你在寻找这样的东西吗? var deferred = protractor.promise.defer(); return deferred.promise;
  • 或者尝试修改该语句?我在非角度上使用量角器,所以我无法使用 q - 但你能做到吗:promises.each(function (foundName) { expect(foundName).toBe(true); });

标签: javascript protractor


【解决方案1】:
    var self = this;

var assignmentPane = self.browser.element(by.id(data.testId + '#' + data.deadline));
expect(assignmentPane.isPresent()).toBe(true);

assignmentPane.click();
self.browser.waitForAngular();

var foundName = false;
element.all(by.binding('member.user.fullname')).each(function (nameColumn) {
    var row = nameColumn.element(by.xpath('..'));
    nameColumn.getText().then(function (name) {
        foundName = foundName || data.name === name;
        if (foundName) {
            var reviewButton = row.element(by.className('icon'));
            expect(reviewButton.isPresent()).toBe(false);
        }
    });
}).then(function () {
    expect(foundName).toBe(true);
});

这并不是一个真正理想的解决方案,但在每个函数之后添加承诺似乎可以解决我遇到的问题。

【讨论】:

    【解决方案2】:

    尝试使用 protractor.promise.all(promises) 函数在解决承诺数组时进行回调 - https://angular.github.io/protractor/#/api?view=promise.all

    q lib 在这里可能不起作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2021-01-29
      相关资源
      最近更新 更多