java - 单击 List<WebElement> 中找到的所有元素

标签 java selenium selenium-webdriver

我试图单击动态表行中 anchor 标记内的 i 标记中找到的类属性找到的元素的所有实例。具体来说,它是一行包含多个单元格的单元格,在最后一个单元格中有一系列 4 个带有 X 或 O 的链接。如果方 block 是 X,则可以单击它,并在短暂等待后更改为 O。链接写法如下:

<a class="foobar"><i class="dontNeedToClick"><i></a>
<a class="foobar"><i class="dontNeedToClick"><i></a>
<a class="foobar"><i class="needToClick"><i></a>
<a class="foobar"><i class="dontNeedToClick"><i></a>

当单击 needToClick 元素时,该类将更改为 dontNeedToClick 元素。在包含数千个 O 的数据库中,需要滚动浏览的 X 不到一百个,因此自动单击它们会节省大量时间。我可以成功计算元素出现在表中的实例,但是当我使用 .findElements() 将元素放入 List 对象并尝试迭代它时,我得到 ElementNotVisibleException。

这是迄今为止我的示例代码:

// get the count of thumbs down accounts
    int elementsCount= driver.findElements(By.className("needToClick")).size();
    System.out.println("Amount of elements: " + elementsCount);

// loop and click through all elements found

    for (int x = 0; x < elementCount; x++) {
        List<WebElement> elements = driver.findElements(By.className("needToClick"));
        WebElement client = elements.get(x);
        client.click();
        Thread.sleep(5000);
    }

我尝试使用 Iterator 并得到了同样的异常。

        Iterator<WebElement> clickElement = elements.iterator();
        while (clickElement.hasNext()) {
            clickElement.next().click();
        }

我也尝试过使用 foreach 循环。

    List<WebElement> thumbsDown = driver.findElements(By.className(expectedClass));

    for(WebElement element : thumbsDown) {
        element.click();
    }

我会使用xpath,但我对动态表不太有经验,并且无法找到一种方法来获取包含我正在查找的元素和与其相关的其他元素的行,并计算出小于优雅的方法,例如仅通过类名查找所有元素就足够了。将不胜感激任何帮助。

最佳答案

确保您尝试单击的元素可见。如果您不关心可见性,请使用 javascipt 单击:

JavascriptExecutor js = (JavascriptExecutor) driver;
WebDriverWait wait = new WebDriverWait(driver, 5);

List<WebElement> elements = driver.findElements(By.className("needToClick"));
elements.forEach(e -> {
    js.executeScript("arguments[0].click();", e);
    wait.until(ExpectedConditions.attributeToBe(e,"class", "dontNeedToClick"));
    //if element have not only dontNeedToClick class use attributeContains
    //wait.until(ExpectedConditions.attributeContains(e,"class", "dontNeedToClick"));
});

检查是否可以单击一个元素并更改类:

driver.findElement(By.className("needToClick")).click();

如果没有尝试xpath:

driver.findElement(By.xpath("//a[i[@class='needToClick']]"));
//or
driver.findElement(By.xpath("//a[i[contains(@class,'needToClick')]]"));

关于java - 单击 List<WebElement> 中找到的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51922937/

相关文章:

java - 应该在pom文件中添加哪个依赖项来导入org.apache.tiles.controller?

java - BndTools,如何添加非 OSGi JAR?使用普通 JAR 会破坏整个项目。缺少要求的接线包

python - selenium.common.exceptions.TimeoutException : Message: Timed out waiting for page to load using IEDriverServer and Internet Explorer through Selenium

java - 如何处理 Selenium 中动态变化的 ID

java - java中的静态 block 和静态变量

java - 检查 PDFBox v2.x.x 签名后 PDF 表单是否发生更改

python - 如何在 python 中保存来自 selenium 和 opencv 的部分屏幕截图

java - 在java中测试文件下载

ruby-on-rails - 我在尝试运行 cucumber 测试时遇到错误,该测试使用 selenium-webdriver 操作确认对话框

java - Selenium WebDriver 按部分类名查找元素