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 + ']'))
...
}
解决方案
因此,首先在迭代 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,所以如果需要更进一步,您应该调用一个调用自身的方法。有了你的想法,你就会陷入死循环。
或者我们错过了问题的全部要点。
推荐阅读
- node.js - 在节点的导入中使用 .ts 扩展名(如 deno)
- java - 电池百分比变化时自动更新小部件
- graphql - 如何使用 Graphql 从 Strapi 查询 Gatsby 中的多个图像
- swift - 无法使用 ForEach 循环 PHFetchResult
- html - 一个元素在另一个元素之上,但居中,具有文本缩放和固定宽度和高度?
- docker - 泊坞窗:来自守护进程的错误响应:超级账本/作曲家-游乐场的拉取访问被拒绝
- excel - ActiveCell.FormulaR1C1 使用类型化字符串与变量字符串
- makefile - 在 makefile 中删除循环依赖
- c# - 在 .netCore 3.1 中使用 Scrutor 装饰 BaseController
- python - 如何解决“RFECV 对象没有 support_ 属性”属性错误?