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

费西奥

我开始对我的sails.js / AngularJS应用进行量角器测试。简化后,我的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]as undefined再次运行测试时可以工作,因此问题应该不在过滤器中,而在其他地方。

关于此事有什么见解吗?

ec

您可以显式等待新书名出现在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);
});

(未测试)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章