我开始对我的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
。再次运行测试时的工作原因所以问题不应该在过滤器中,而应该在其他地方。
有关此事的任何见解?
答案 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);
});
(未经测试)