首页 > 解决方案 > 在迭代期间更改所有列表项

问题描述

问题

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

代码

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

标签: groovy

解决方案


因此,首先在迭代 List 时,更改或删除元素是不安全的。这是可能的,但你应该避免它。那是因为您正在尝试更改它当前正在迭代的元素。因此,'.each' 闭包后面的迭代器会感到困惑,并且不知道在当前迭代之后继续往哪里走。

如果您必须使用相同的操作更改所有元素,您可以使用 groovy 提供的 List.collect() 闭包,它会将您喜欢的任何内容返回到新列表中。

例如:

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,所以如果需要更进一步,您应该调用一个调用自身的方法。有了你的想法,你就会陷入死循环。

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


推荐阅读