Selenium WebDriver在执行一次后退出for循环时出现问题。据推测,这是在加载页面之前获取内容和循环的问题。是否有可能让webdriver等到页面加载?
List<WebElement> albums = new ArrayList<WebElement>();
albums = driver.findElements(By.className("album_title"));
for (WebElement we : albums) {
we.click();
if (driver.findElement(By.id("delete_album_prompt")).isDisplayed()) {
driver.findElement(By.id("delete_album_prompt")).click();
driver.findElement(By.id("delete_album_yes")).click();
} else {
break;
}
}
答案 0 :(得分:1)
您需要等待加载元素。
在Selenium documentation中,他们提供了以下示例,该示例将等到加载Google页面。在这种情况下,它等待,最多10秒,加载标题元素并具有指定的值。
// Google's search is rendered dynamically with JavaScript.
// Wait for the page to load, timeout after 10 seconds
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().toLowerCase().startsWith("cheese!");
}
});
答案 1 :(得分:1)
使用此选项,其中TimeOut
定义为int
值。
Wait wait = DriverManager.getWait(Driver.TIMEOUT);
wait.until(ExpectedConditions.visibilityOfElementLocated(by));
基本上等待元素加载。这比提供睡眠更好。
答案 2 :(得分:0)
你可以使用Thread.sleep(20000);在循环开始之前使用此方法。
答案 3 :(得分:0)
我想,您正在检查列表中的项目
driver.findElement(By.id("delete_album_prompt")).isDisplayed()
对于第1项将返回true,但对于列表中的剩余项目,它将返回false,因为这些项目不会显示。这就是它退出环路的原因。
您可以使用以下功能检查if
private boolean isElementPresent(WebDriver driver, By by){
try{
driver.findElement(by);
return true;
}catch(NoSuchElementException e){
return false;
}
}
答案 4 :(得分:0)
我正在使用 - wait.until(elementToBeClickable(By.id(“id”)));它有效!