山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

【Selenium】自動でスクリーンショットを取る

前回、Selenium を使用して自動でブラウザを操作させてみました。

www.shookuro.com

今回は自動操作に加え、スクリーンショットを取りたいと思います。

各種バージョンはこちら。

Java : 11
Spring Tool Suite(IDE): 4.3.2
Selenium Server : 3.9.1

スクリーンショットをファイルで保存

結論から言うと「WebDriver#getScreenshotAs(OutputType target)」を利用します。

TakesScreenshot (selenium-api 2.52.0 API)

このメソッドを使うことにより、File・Byte[]・BASE64 の文字列のいずれかのインスタンスを取得できます。

File を選択した場合、png ファイルがシステムの TEMP 領域に取得されます。プログラムが終了すると自動で消されてしまうので、コピーを取っておく必要があります。

システムの TEMP 領域は Windows の場合、コマンドプロンプトを起動し「set temp」で確認できます。

C:\Users\yyama>set temp
TEMP=C:\Users\yyama\AppData\Local\Temp

 
 
さっそく前回のソースにスクリーンショット取得のコードを追加してみました。

package org.yyama.selenium_sample;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

/**
 * Hello world!
 *
 */
public class App {
	public static void main(String[] args) throws IOException {

		// WebDriver が存在するパスを指定する。プロジェクト直下においてあれば不要。
//		System.setProperty("webdriver.gecko.driver", "C:/org/yyama/geckodriver.exe");

		// WebDriver を取得する
		WebDriver driver = new FirefoxDriver();

		// Google の検索ページを開く
		driver.get("http://www.google.com");

		// 検索文字を入力するテキストボックスを取得
		WebElement element = driver.findElement(By.name("q"));

		// 検索文字を入力する
		element.sendKeys("5兆円おくれ");

		// サブミット
		element.submit();

		// ページタイトルが変わるまで待つ。10 秒待っても変わらない場合、
		// org.openqa.selenium.TimeoutException」が発生する。。
		(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver d) {
				return d.getTitle().toLowerCase().startsWith("5兆円おくれ");
			}
		});

		// スクリーンショットを取得し、ファイルを退避する。 ← ← ← ここを追加。
		File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
		Files.copy(file.toPath(), new File("D:/yyama/" + file.getName()).toPath());

		// ブラウザを閉じる。(ここでは勝手に閉じないようにコメントにしてある)
//		driver.quit();

	}
}

これを実行すると D:\yyama に「screenshot250604932438781944.png」ファイルが格納され、開くと次のような画像が表示されました。
f:id:yyama1556:20191117153711p:plain

まとめ

前回のプログラムに 2 行を追加するだけでスクリーンショットが取れるようになりました。

ただ、この方法だとスクロールが必要な画面では画面全体を保存することが出来ません。

また、スクリーンショット画像に URL を含めたい場合などもありますよね。

これらの課題にもいずれ対応していきたいです。

それでは!

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

  • 作者: 伊藤望,戸田広,沖田邦夫,宮田淳平,長谷川淳,清水直樹,Vishal Banthia
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/02/02
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (4件) を見る
実践 Selenium WebDriver

実践 Selenium WebDriver