2017/06/05頃にChrome59がリリースされたようです。
このバージョンからヘッドレスモード対応との事で、待ち遠しくしていた方々も多いのではと思います。
ただし最新版のドライバーChromeDriver2.29ではChrome58までしか対応していないため、もうしばらく待つ必要があります。とはいえ、ある程度は動かせるので、準備をしておくことは可能です。
ヘッドレスモードでの動作方法
通常時(非ヘッドレスモード)はChrome59+ChromeDriver2.29の組み合わせで問題なく動作するようです。
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver = new ChromeDriver();
driver.get("http://qiita.com/");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("/path/to/screenshot.png"));
driver.quit();
そして「ヘッドレス Chrome ことはじめ」などを参考にしてChromeのパラメータを追加します。
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
// Chromeのパラメータ「--headless --disable-gpu」指定
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless", "--disable-gpu");
// WebDriver driver = new ChromeDriver();
WebDriver driver = new ChromeDriver(options);
driver.get("http://qiita.com/");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("/path/to/screenshot.png"));
driver.quit();
こんな感じにすれば、ディスプレイのない環境でもスクリーンショットが撮れます。
現時点での動作比較
私のLinux環境だけなのかもしれませんが、よく理解できない動作の違いがちらほら見られます。
安定するまでは注意して使用したほうが良さそうです。
プロキシ設定が動作しない
OS設定と異なるプロキシを使用する場合、Chromeではパラメータ
-–proxy-server="http=xxx.xxx.xxx.xxx:8080;https=xxx.xxx.xxx.xxx:8080"
--proxy-bypass-list="local-test-server"
のように指定すればいいはずなのですが、ヘッドレスモード時にこれを付けると
WebDriver driver = new ChromeDriver(options);
あたりで止まってしまいます。
証明書に問題のあるサイトにアクセスできない
URLの左側に赤い三角が出るサイトにアクセスしようとすると
driver.get(url);
で止まります。Chromeのパラメータ--ignore-certificate-errors
というのを付けてみても変化なし。
ウインドウの切り替え処理が動作しない
複数ウインドウが絡むサイトの場合、
driver.switchTo().window(windowId);
のようにして切り替えるのですが、数分待っても切り替わりません。