2013-11-15 10 views
9

私が達成しようとしているのは、ページをブラウズして何かが読み込まれてからスクリーンショットを取得して保存することです。セレンがX秒間ポーズするようにする

私が既に持っているコードは

WebDriver driver = new FirefoxDriver(); 


driver.get("http://www.site.com"); 


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

try { 

    File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 
    FileUtils.copyFile(scrFile, new File("/home/Desktop/image.png")); 

} catch (Exception e) { 

     e.printStackTrace(); 
} 

driver.close(); 

私はそれがロードされますが、サイト上のコンテンツは、私が利用したいと思いますので、ロードされているページがある場合でも、待機する必要がある理由数秒後に負荷の画像。何らかの理由でページが待機していないので、私はドライバ/ページをX秒間待つために使うことができる別の方法がありますか?

+0

この記事をチェックしてください:http://stackoverflow.com/questions/5868439/wait-for-page-load-in-selenium – Gayathri

答えて

6

最初のページが読み込まれた後に読み込まれた要素を見つけて、その要素が見つかるまでSeleniumを待機させることができます。

WebDriverWait wait = new WebDriverWait(driver, 10); 
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("ID"))); 
+1

このアプローチでは、ExpectedConditionが500msごとにテストされ、条件が満たされているかどうか(「ID」要素が表示されているかどうか)をタイムアウト(ここでは10に設定)まで調べます。カスタム述語については、独自の条件を記述することも可能です。これに関するドキュメントはhttp://www.seleniumhq.org/docs/04_webdriver_advanced.jspにあります。 – anotherdave

5

これは本当にセレン特有のものではありません。あなたはちょうど画面を読み込む前に、スクリーンショットを撮る前に、少し眠ってほしいと思う。

Thread.sleep(4000); 

driver.getステートメントの後にそれを入れます。

+2

私がupvotingしていない理由は、このような明示的な待機。悪い。 – sircapsalot

+0

したがって、1000のスイートで各テストでスクリーンショットを撮っていて、要素が通常500ミリ秒後に読み込まれた場合、この方法はビルド時間に1時間を追加します。 – anotherdave

+0

@sircapsalot閉じる前にブラウザを2秒間開いたままにしたい場合(私は.Quit()を呼び出します)、どうすればよいですか? – MStodd

1

場合によっては、誰かを助けるために、常に暗黙の待ち、特にThread#sleepを避けるようにしてください。 Thread.sleep(10)を実行すると、コードはになります。は、1秒後にページが準備できても10秒間待機します。したがって、これを頻繁に使用すると、テストが大幅に遅くなる可能性があります。

ExplicitWaitsを使用すると、何らかのアクションが発生したり、一部の要素がページに表示されたりするのを待っていることを意味します。あなたのケースでは、私は明示的にwaitを使用して、すべてがロードされているかどうかを確認し、スクリーンショットを撮ります。

+0

ExplicitWaitsリンクをありがとう、本当に助けてください! :) –

0

は、秒の一定数を遅らせることはなく、できるだけ早く対応したい場合は、ここでのセレンIDEが提供するものに似て一時停止するための機能である:

public void pause(Integer milliseconds){ 
    try { 
     TimeUnit.MILLISECONDS.sleep(milliseconds); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

source

は、
関連する問題