2015-10-06 52 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()'命令。希望它有幫助 –