2015-10-06 27 views
1

我有以下的测试(用于brievity的缘故,我已经删除了页面对象):量角器:遍历选项工作,如果调试,但没有如果没有

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()在循环中,这工作和测试通过,但是,如果我不调试测试似乎太快,我的表不会更新得足够快,测试失败。我猜这是因为承诺没有解决,代码仍在运行,但我不确定我在等待什么诺言,因为我也试图在我之后立即输入.then(function() {...}将密钥发送到组合框。

回答

0

我猜你的for循环执行得很快,所以它内部等待promise的代码会被跳过。您可以通过执行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); 
     }); 
     } 
    }); 
}); 

您可以使用之间的等待,以确保您的DOM更新,然后再执行任何操作。希望它解决了你的问题。

+0

尽管当我将它提取到一个单独的函数中时它看起来会变慢,但我的组合框只能获得第一次以此方式发送的键并忽略其他值(我添加了一个console.log以确保不同的文本值在那里)。任何想法为什么组合框忽略发送更多的密钥? 此外,为什么代码在我将其提取到函数中时起作用,它会产生什么不同? – user2352164

+0

从我所知道的情况来看,第二次调用sendkeys时实际上并不会删除第一次发送的密钥。这会导致问题,因为我无法清除()实际的选择框。有什么建议么? – user2352164

+0

@ user2352164您必须手动清除文本框或组合框值。只要你输入新的东西,它就会增加现有的价值。为了除去现有数据,在输入新数据之前,在函数结尾处包含一个'element(by.model(“elc.search.placeOfBirth”))。clear()'命令。希望它有帮助 –