量角器:迭代选项在调试时有效,但如果没有则无效

时间:2015-10-06 18:38:41

标签: angularjs combobox protractor

我有以下测试(为了简洁起见,我已经删除了页面对象):

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() {...}置于正确位置。

1 个答案:

答案 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。希望它能解决你的问题。