Java WebDriver等待页面加载

时间:2012-03-28 08:50:22

标签: webdriver timeout

我希望获得页面加载的异常,但仍然没有结果。 我使用implicitlyWait来设置计时器以抛出异常。

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(1, TimeUnit.MILLISECONDS);
driver.get("http://www.rambler.ru");
driver.quit();

有人可以给我更新建议吗?我需要这个以确保页面加载不会是无限的,并且如果加载时间将超过我在计时器中定义的 - >结果抛出异常并跳过TC(失败)。

谢谢你, 弗拉基米尔

2 个答案:

答案 0 :(得分:17)

为什么在打开页面之前使用隐式等待?尝试使用显式等待。在ramber中查找一些主要页面元素(例如,搜索文本框)。例如:

 WebDriverWait wait = new WebDriverWait(webDriver, 5);
 wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_to_search_textbox")));
如果搜索文本框不会在5秒内出现,

until()方法将抛出TimeoutException。

答案 1 :(得分:0)

我不同意Pavel Zorins的回答会有效,因为他没有说明如何处理这些异常。

以下是我等待iFrame的方法。这要求您的JUnit测试类将RemoteWebDriver的实例传递给页面对象:

public class IFrame1 extends LoadableComponent<IFrame1> {

    private RemoteWebDriver driver;

    @FindBy(id = "iFrame1TextFieldTestInputControlID" )
    public WebElement iFrame1TextFieldInput;

    @FindBy(id = "iFrame1TextFieldTestProcessButtonID" )
    public WebElement copyButton;

    public IFrame1( RemoteWebDriver drv ) {
        super();
        this.driver = drv;
        this.driver.switchTo().defaultContent();
        waitTimer(1, 1000);
        this.driver.switchTo().frame("BodyFrame1");
        LOGGER.info("IFrame1 constructor...");
    }

    @Override
    protected void isLoaded() throws Error {        
        LOGGER.info("IFrame1.isLoaded()...");
        PageFactory.initElements( driver, this );
        try {
            assertTrue( "Page visible title is not yet available.", driver
     .findElementByCssSelector("body form#webDriverUnitiFrame1TestFormID h1")
                    .getText().equals("iFrame1 Test") );
        } catch ( NoSuchElementException e) {
            LOGGER.info("No such element." );
            assertTrue("No such element.", false);
        }
    }

    @Override
    protected void load() {
        LOGGER.info("IFrame1.load()...");
        Wait<WebDriver> wait = new FluentWait<WebDriver>( driver )
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring( NoSuchElementException.class ) 
                .ignoring( StaleElementReferenceException.class ) ;
            wait.until( ExpectedConditions.presenceOfElementLocated( 
            By.cssSelector("body form#webDriverUnitiFrame1TestFormID h1") ) );
    }
....

注意:您可以see my entire working example here