0

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;
        }

    }
4

5 回答 5

1

您需要等待一个元素被加载。

Selenium 文档中,他们提供了以下示例,该示例将等到加载 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!");
    }
});
于 2012-12-18T12:59:32.757 回答
1

使用这个,其中TimeOut定义为int值。

Wait wait = DriverManager.getWait(Driver.TIMEOUT);
wait.until(ExpectedConditions.visibilityOfElementLocated(by));

基本上等待一个元素被加载。这比提供睡眠要好。

于 2013-06-12T05:29:41.200 回答
0

您可以使用 Thread.sleep(20000); 在循环开始之前使用此方法。

于 2012-12-18T14:36:00.310 回答
0

我想,您正在检查列表中的项目

driver.findElement(By.id("delete_album_prompt")).isDisplayed() 

这将为第一项返回 true,但对于列表中的其余项目,它将返回 false,因为这些项目不会显示。这就是它退出循环的原因。

您可以使用以下功能检查项目存在if

private boolean isElementPresent(WebDriver driver, By by){
try{
driver.findElement(by);
return true;
}catch(NoSuchElementException e){
return false;
}
}
于 2012-12-18T14:36:41.597 回答
0

我正在使用 - wait.until(elementToBeClickable(By.id("id"))); 有用 !

于 2014-08-01T07:13:26.910 回答