2012-03-28 94 views
8

我想获得页面加载的例外,但是还没有结果。 我使用implicitlyWait来设置定时器来抛出异常。Java WebDriver等待页面加载

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

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

谢谢 沃洛

回答

17

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

WebDriverWait wait = new WebDriverWait(webDriver, 5); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_to_search_textbox"))); 

直到()方法将抛出TimeoutException,如果搜索文本框不会在5秒内出现。

+0

谢谢你的建议,纠正我,如果我错了,你建议我在driver.get(“http://www.rambler.ru”)后使用等待元素。但WebDriver将等待,直到driver.get()将完成页面加载,并将转到元素等待? – 2012-03-28 11:00:46

+0

webdriver总是等待加载页面。可能是我对你的问题有错误的理解。在这种情况下,如果加载时间超过30秒(例如) – 2012-03-28 11:13:38

+0

我的意思是:http:// stackoverflow .com/a/6107997/1165331 – 2012-03-28 11:18:54

0

我不同意帕维尔佐林斯的答案将工作,因为他没有展示如何处理例外。

下面是我如何等待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

相关问题