如何在selenium webdriver中手动等待

时间:2017-05-15 04:35:47

标签: selenium selenium-webdriver automation

我有一个最终用户页面,其中包含多个控件(文本框,复选框,下拉列表),例如30。所有这些都是从管理面板启用的。

我已将所有这些都包含在try catch块中,例如

try
{
    driver.findElement(By.locator); // For Control 1
}
catch(Exception e)
{

}
try
{
    driver.findElement(By.locator); // For Control 2
}
catch(Exception e)
{

}

and So On...

问题是,假设管理员只启用了我的代码中最后一个字段。因此,在执行脚本时,我的脚本太慢,因为它逐个检查每个元素,如果没有找到,则在catch块中处理它,直到找到最后一个元素。

有没有办法减少浪费时间?

3 个答案:

答案 0 :(得分:1)

您可以使用findElements并检查是否找到任何元素。如果没有,你会得到一个没有例外的空列表。您可以构建一个方法,如果元素存在则返回该元素,如果不存在,则构建null

private WebElement findElement(WebDriver driver, By locator) {
    List<WebElement> elements = driver.findElements(By.locator);
    return elements.size() > 0 ? elements.get(0) : null;
}

findElements(driver, By.locator); // For Control 1
findElements(driver, By.locator); // For Control 2
// ...

答案 1 :(得分:0)

您可以通过以下方式管理超时:

driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

如果您想要在方法的开头,然后再将其设置为您所拥有的,并且最符合您网站的需求,则可以执行此操作。

更多相关内容:http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp

答案 2 :(得分:0)

在这种情况下,使用FluentWait是最可靠的方法。您应该使用driver.findElement(By)查看,而是在常用的类中创建方法getElement(By),例如BasePage.class

public class BasePage {

    WebDriver driver;

    public BasePage(WebDriver driver) {
        this.driver = driver;
    }

    public WebElement getElement(By locator) {
        // Waiting 30 seconds for an element to be present on the page, checking
        // for its presence once every 5 seconds.
        Wait wait = new FluentWait(driver)
            .withTimeout(30, SECONDS)
            .pollingEvery(5, SECONDS)
            .ignoring(NoSuchElementException.class);

        // Get the web element
        WebElement element = wait.until(new Function() {
            public WebElement apply(WebDriver driver) {
                return driver.findElement(By.id("foo"));
            }
        });

        return element;
    }
}