tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

SeleniumRCを使って主要ブラウザで画面のキャプチャを撮る方法

今まで

とかやってたけど、ブラウザ依存のアドオン使って云々だったので、対応するアドオンが無いSafariとかChromeとか(あと一応Operaだとか)ではキャプチャが撮れないので、キャプラという汎用的にキャプチャを撮るソフトを使ってブラウザに依存しないで撮る方法を試してみました。

ただし、結論から言うとSafariだけはスクロールする画面がキャプチャできません。

事前準備

  • キャプラをインストールしておく。
  • Safariのメニュー→編集の中の「ポップアップウィンドウを開かない」のチェックを外しておく。
  • selenium-server.jarとselenium-java-client-driver.jarをクラスパスに通しておく。

SeleniumCapwriteTest

package example.test;

import junit.framework.TestCase;

import org.openqa.selenium.server.RemoteControlConfiguration;
import org.openqa.selenium.server.SeleniumServer;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

public class SeleniumCapwriteTest extends TestCase {
	public static int PORT = 4444;
	static {
		// テスト対象サーバへの接続にProxyが必要な場合のみ設定
		System.setProperty("http.proxyHost", "proxy");
		System.setProperty("http.proxyPort", "8080");
	}

	private SeleniumServer server;

	public void setUp() throws Exception {
		SeleniumServer.setDebugMode(true);
		SeleniumServer.setAvoidProxy(true);
		server = new SeleniumServer(false);
		RemoteControlConfiguration config = server.getConfiguration();
		config.setMultiWindow(true);
		config.setPort(PORT);
		server.start();
	}

	public void testIE() throws Exception {
		run("*iexplore");
	}

	public void testFirefox() throws Exception {
		// firefox.exeへのパスを通している場合は"*firefox"でも可
		run("*firefoxproxy C:\\Program Files\\Mozilla Firefox\\firefox.exe");
	}

	public void testSafari() throws Exception {
		// CapWriteの仕様?でスクロールする画面がうまくキャプチャできない
		run("*safari");
	}

	public void testChrome() throws Exception {
		run("*googlechrome");
	}

	public void testOpera() throws Exception {
		run("*opera");
	}

	public void run(String browser) throws Exception {
		String baseUrl = "http://www.google.co.jp";
		Selenium client = new DefaultSelenium("localhost", PORT, browser, baseUrl);
		client.start();
		client.setTimeout("60000");
		client.windowMaximize();

		// 検索画面で検索
		client.open(baseUrl + "/webhp?hl=ja");
		client.type("q", "selenium");
		client.click("btnG");
		client.waitForPageToLoad("30000");
		assertEquals("selenium - Google 検索", client.getTitle());

		// 画面キャプチャを撮る
		client.windowFocus();
		capture("C:\\");

		client.stop();
	}

	private boolean capture(String outputDir) throws Exception {
		// キャプラ起動オプション
		// /C3 - ウィンドウまたはコントロール
		// /W1 - 画面中央位置にあるウィンドウまたはコントロール
		// /R - トリミング加工する
		// /T1 - 1秒後にキャプチャを開始する
		// /A5;"outputDir";10" 連続して保存; 保存パス; PNG形式
		ProcessBuilder builder = new ProcessBuilder("C:\\Program Files\\capwrite\\capwrite.exe", "/C3", "/W1", "/R", "/T1", "/A5;\"" + outputDir + "\";10");
		Process process = builder.start();
		process.waitFor();
		return process.exitValue() == 0;
	}

	public void tearDown() {
		server.stop();
	}
}