我试图单击动态表行中 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/