【发布时间】:2015-03-10 17:04:56
【问题描述】:
当我在循环中使用量角器时,循环索引 (i) 不是我所期望的。
症状:
失败:索引超出范围。试图访问 index:'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 是的,这是经典的闭环问题,我在答案中引用了stackoverflow.com/questions/750486/…。但是,我打开它有两个原因。 1)许多人没有意识到两者之间的相关性,因为有些人不了解 elementFinders 返回的承诺和 2)关闭不是量角器的最佳解决方案,因为对此有量角器特定的解决方案 - 请参阅答案
-
悬念要了我的命!哪两个原因?
-
抱歉输入太快了。编辑了第一个回复。
-
在数组上使用 .filter(或 .map 或 .forEach)实际上是我在 JS 中通常会这样做(假设没有“let”)。所以我不会称它为量角器特定的。人们不知道这两者之间存在相关性这一事实正是为什么通常不删除重复项的原因——因此他们可以使用相关关键字找到这个问题,然后找到一般问题。我感谢您在这些方面付出的努力(上帝知道我们可以在 promise 标记中使用更多规范),但我不确定这是否合适,因为有类似的规范。如果您愿意,我们可以在 meta 中询问。你怎么看?
标签: angularjs selenium-webdriver promise protractor