问题
我需要在循环中更改所有列表项。有可能吗?
代码
List<WebElement> elements = driver.findElements(By.xpath('//*[@id="id1"]//tr[td/a]'))
elements.eachWithIndex { element, index ->
...
if(...) {
...
i = index+1
elements = driver.findElements(By.xpath('//*[@id="id1"]//tr[td/a][position()>' + i + ']')) // new list content which must be use by loop
}
}
但是,循环不使用新列表。
您能帮我解释一下吗?
谢谢
致谢
编辑1
我每次都需要检索元素。
List<WebElement> elements = driver.findElements(By.xpath('//*[@id="dzA26"]//tr[td/a]'))
for(int i = 1; i <= elements.size(); i++) {
WebElement element = driver.findElement(By.xpath('//*[@id="dzA26"]//tr[td/a][' + i + ']'))
...
}
答案 0 :(得分:1)
因此,首先在遍历List时,更改或删除元素并不安全。有可能,但是您应该避免这种情况。 那是因为您试图更改当前正在迭代的元素。因此,“。each”闭包后面的迭代器会感到困惑,并且不知道在当前迭代之后继续执行什么操作。
如果必须使用相同的操作更改所有元素,则可以使用groovy提供的List.collect()闭包,它将把您喜欢的内容返回到新的List中。
例如:
List<WebElement> elements = elements.collect { element ->
return element.doSomething()
}
编辑1
更新之后,出现了一个新问题,因为您似乎总是想更新列表中的所有元素。
所以为什么不在循环内创建列表,填充并使用它,然后转到下一个迭代。
例如:
for(int i = 0;i < threshold; i++) {
List<WebElement> elements = useMethodToRetrieveElementsFori(i);
elements.each {
// Do whatever has to be done with this element.
}
}
或者在看了更长的时间后,此时显然可以使用代码反射。因为您想更深入地研究WebElements,所以如果需要更进一步,则应该调用一种调用自身的方法。有了您的想法,您将陷入无休止的循环。
或者我们错过了问题的全部要点。