Java Selenium等待超时元素

时间:2012-06-11 06:25:05

标签: java firefox selenium webdriver

我正在使用Java中的Selenium FirefoxDriver开发一个测试单元。我想要一些帮助处理页面加载。我的问题是等待元素,但仍有超时。我已经尝试应用pageLoadTimeoutimplicitlyWait但没有成功,有些方法会继续等待整页加载。我的代码预览:

    (...)
    FirefoxDriver driver= new FirefoxDriver(firefoxProfile);
    driver.manage().timeouts().pageLoadTimeout(1, TimeUnit.MILLISECONDS);
    driver.manage().timeouts().implicitlyWait(1, TimeUnit.MILLISECONDS);
    try {
       driver.get("http://mysite");
    } catch (org.openqa.selenium.TimeoutException e) {
       //after 1 milisecond get method timeouts
    }
    for (int i = 0; i < 5; i++) {//5 seconds wait
            if (driver.findElements(By.id("wait_id")).size() == 0) { //findElements cause java to wait for full load
                debug("not found");//never happens because 'if' condition waits for full load
                driver.wait(1000);
            } else {
                debug("found");
                break;
            }
        }

提前致谢。

3 个答案:

答案 0 :(得分:1)

public static WebElement waitForElement(WebDriver driver, By by) {

    WebElement element = null;
    int counter = 0;
    while (element == null) {
        try {
            Thread.sleep(500);
            element = driver.findElement(by);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (counter > 119) {
            System.out.println("System has timed out");
        }
                    counter++;
    }
    return element;

答案 1 :(得分:0)

driver.get是一个阻塞调用,等待页面加载。 由于您将超时设置为1毫秒,因此会引发超时异常。 如果您在e.printStackTrace(); cacht block中放置org.openqa.selenium.TimeoutException,就可以看到它。

将超时设置为-1。

答案 2 :(得分:0)

pageLoadTimeout()方法仅适用于使用"unstable load strategy"运行的Firefox。因此,像这样运行FirefoxDriver

FirefoxProfile fp = new FirefoxProfile();
fp.setPreference("webdriver.load.strategy", "unstable");
WebDriver driver = new FirefoxDriver(fp);

请注意,它仅适用于Firefox,确实不稳定,并且可能会使您的其他一些测试失败。请谨慎使用。