循環索引(i
)不是我期望的,當我在一個循環內使用量角器。使用量角器與循環
症狀:
失敗:索引超出界限。試圖在索引來訪問元素:「X」,但只有「X」元素
或
指數是靜態的,總是等於最後一個值
我代碼
for (var i = 0; i < MAX; ++i) {
getPromise().then(function() {
someArray[i] // 'i' always takes the value of 'MAX'
})
}
例如:
var expected = ['expect1', 'expect2', 'expect3'];
var els = element.all(by.css('selector'));
for (var i = 0; i < expected.length; ++i) {
els.get(i).getText().then(function(text) {
expect(text).toEqual(expected[i]); // Error: `i` is always 3.
})
}
或
var els = element.all(by.css('selector'));
for (var i = 0; i < 3; ++i) {
els.get(i).getText().then(function(text) {
if (text === 'should click') {
els.get(i).click(); // fails with "Failed: Index out of bound. Trying to access element at index:3, but there are only 3 elements"
}
})
}
或
var els = element.all(by.css('selector'));
els.then(function(rawelements) {
for (var i = 0; i < rawelements.length; ++i) {
rawelements[i].getText().then(function(text) {
if (text === 'should click') {
rawelements[i].click(); // fails with "Failed: Index out of bound. Trying to access element at index:'rawelements.length', but there are only 'rawelements.length' elements"
}
})
}
})
感謝您的努力 - 但這是經典的閉環問題。 –
@BenjaminGruenbaum是的,這是經典的閉環問題,我在答案中引用了http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example。但是,我打開這個有兩個原因。 1)很多人沒有意識到兩者之間的相關性,因爲有些人不理解elementFinder返回的承諾,2)閉合不是量角器的最佳解決方案,因爲有量角器特定的解決方案 - 請參閱答案 – hankduan
懸念是殺了我!有兩個原因? –