我开始对我的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
。再次运行测试时可以工作,因此问题应该不在过滤器中,而在其他地方。
关于此事有什么见解吗?
您可以显式等待新书名出现在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] 删除。
我来说两句