我有以下测试(为了简洁起见,我已经删除了页面对象):
element(by.model("elc.search.placeOfBirth")) //this is a select
element(by.model("elc.search.placeOfBirth")).all(by.tagName("option")).then(function(options) {
for(var i = 0; i < options.length; i++) {
options[i].getText().then(function(text) {
if(text !== "---") {
element(by.model("elc.search.placeOfBirth")).sendKeys(text);
var firstRow = element.all(by.repeater("employee in elc.filtered")).first();
firstRow.all(by.tagName("td")).then(function(cells) {
expect(cells[4].getText()).toBe(text);
});
var lastRow = element.all(by.repeater("employee in elc.filtered")).last();
lastRow.all(by.tagName("td")).then(function(cells) {
expect(cells[4].getText()).toBe(text);
});
}
});
}
});
让我解释一下这里发生了什么。我上面有一张桌子和一个选择框。表格的第5列与选择组合框相关,我在表格的ng-repeat中使用的数组被组合框中的值过滤。我想在这里做的是检查组合框中的值,选择一个特定的值,并确保该表在第一行和最后一行中具有该值。
如果我在循环中browser.debugger()
这是有效的并且测试通过了,但是如果我不进行调试,那么测试似乎过快而且我的表格没有足够快地更新并且测试失败了。我猜这是因为承诺没有得到解决而且代码一直在运行,但我不确定我在等什么承诺,因为我&#39;在我将密钥发送到组合框之后,我还尝试将.then(function() {...}
置于正确位置。
答案 0 :(得分:0)
我猜你的for
循环很快就会执行,因此等待promises的代码会被跳过。您可以通过在for
循环内执行函数来避免它。更新您的代码 -
var someFunction = function(options, i){
//Write your code that was inside your for loop
};
element(by.model("elc.search.placeOfBirth")).all(by.tagName("option")).then(function(options) {
for(var i = 0; i < options.length; i++) {
someFunction(options, i);
}
});
然而,这个问题有一个更好的解决方案。使用量角器具有.each()
或.map()
的内置循环来完成工作。这是如何 -
element(by.model("elc.search.placeOfBirth")).all(by.tagName("option")).each(function(option) {
option.getText().then(function(text) {
if(text !== "---") {
element(by.model("elc.search.placeOfBirth")).sendKeys(text);
var firstRow = element.all(by.repeater("employee in elc.filtered")).first();
firstRow.all(by.tagName("td")).then(function(cells) {
expect(cells[4].getText()).toBe(text);
});
var lastRow = element.all(by.repeater("employee in elc.filtered")).last();
lastRow.all(by.tagName("td")).then(function(cells) {
expect(cells[4].getText()).toBe(text);
});
}
});
});
您可以在两者之间使用wait来确保在执行任何操作之前更新DOM。希望它能解决你的问题。