在迭代过程中更改所有列表项

时间:2018-07-30 12:35:39

标签: groovy

问题

我需要在循环中更改所有列表项。有可能吗?

代码

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 + ']'))
    ...
}

1 个答案:

答案 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,所以如果需要更进一步,则应该调用一种调用自身的方法。有了您的想法,您将陷入无休止的循环。

或者我们错过了问题的全部要点。