量角器 - $ http调用后在转发器中选择元素

时间:2015-05-25 14:27:06

标签: ajax angularjs selenium sails.js protractor

我开始对我的sails.js / AngularJS app进行量角器测试。简化,我的HTML中有以下类型的ng-repeat:

<div ng-repeat="book in books">
  book.name
</div>

我的测试点击了一个按钮,该按钮向服务器发送$ http POST调用,创建另一本书,并在成功时将另一本书添加到$ scope.books。问题是测试失败,因为当测试检查它的存在时,还没有创建该书。我知道我的定位器/过滤器工作,因为再次运行测试(=在发送呼叫之前存在该书)测试成功。

测试:

    element.all(by.buttonText('Save')).
        filter(function(elem) {return elem.isDisplayed();}).
        first().
        click();

    browser.sleep(500); // even this doesn't work :(

    element.all(by.repeater('book in books')).filter(function(elem, index) {
        return elem.getText().then(function(text) {
            return text === "nameOfBook";
        });
    })
    .then(function(books) {
        expect(books[0].isPresent()).toEqual(true);
    });

到目前为止,我遇到的答案似乎表明量角器应该在继续之前自动等待$ http调用完成,但就我而言,它似乎并非如此。

我甚至尝试过4000毫秒左右的睡眠时间,我已经可以在转发器中看到新元素,但测试仍然将books[0]视为undefined。再次运行测试时的工作原因所以问题不应该在过滤器中,而应该在其他地方。

有关此事的任何见解?

1 个答案:

答案 0 :(得分:5)

您可以explicitly wait让新书名出现在DOM中:

var EC = protractor.ExpectedConditions;

var elm = element(by.xpath("//div[. = 'nameOfBook']"));
browser.wait(EC.presenceOf(elm), 10000);

您还可以等待转发器中元素的数量增加:

var countOfElementsToBe = function(elms, expectedValue) {
  return elms.count().then(function (actualValue) {
      return expectedValue === actualValue;
  });
};

var books = element.all(by.repeater('book in books'));
books.count().then(function (booksCount) {
    browser.wait(countOfElementsToBe(books, booksCount + 1), 10000);
});

(未经测试)