代码之家  ›  专栏  ›  技术社区  ›  Royce

在迭代期间更改所有列表项

  •  -1
  • Royce  · 技术社区  · 6 年前

    问题

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

    代码

    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 回复  |  直到 6 年前
        1
  •  1
  •   TheRealHypo    6 年前

    因此,首先在遍历列表时,更改或删除元素是不安全的。这是可能的,但你应该避免。 这是因为您正在尝试更改它当前正在迭代的元素。所以“.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,所以如果需要进一步,应该调用调用自身的方法。有了你的想法,你将陷入一个无止境的循环。

    或者我们忽略了问题的全部要点。