2012-03-28 7 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

をいただき、ありがとうございますか!明示的な待機を使用してください。砂漠の主要なページ要素を見つけます(たとえば、検索テキストボックス)。例:

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

until()メソッドは、検索テキストボックスが5秒以内に表示されない場合、TimeoutExceptionをスローします。

+0

あなたの提案をありがとう、私が間違っている場合は、私はdriver.get( "http://www.rambler.ru"の後に要素を待つ使用することをお勧めします。 WebDriverはdriver.get()がページの読み込みを終了して要素待機に行くまで待機しますか? –

+0

webdriverは常にページの読み込みを待ちます。あなたの質問を間違って理解しているかもしれません。この場合、get( "rambler.ru")を呼び出してロード時間が30秒を超えた場合(例のように)、TimeoutExceptionをスローすると、カウントを開始するtimerを使用できます。 –

+0

私はそれを意味します:http:// stackoverflow .com/a/6107997/1165331 –

0

例外を処理する方法が示されていないため、Pavel Zorinsの回答がうまくいくことに同意しません。

ここでは、iFrameを待つ方法を説明します。

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これはあなたのJUnitテストクラスは、ページオブジェクトにRemoteWebDriverのインスタンスを渡す必要があります。

関連する問題