2017/07/24 時点
- ChromeDriver 2.30
- Debian 8 Jessie(Dockerコンテナ上で実行)
- google-chrome-stable 59.0.3071.115-1
Chromeでは、59からヘッドレスモードを利用できるようになりました。
元々はXvfbを使ってSeleniumのテストを動かしていたのですが、ヘッドレスにできるなら不要では!と思い、ヘッドレスモードで動かしてみました。
JavaでSeleniumを利用する場合は以下のようにChromeOptions
で--headless
と設定を追加してやれば良いです。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver Driver = new ChromeDriver(chromeOptions);
自身はSelenideを使っているので、以下のようにmavenの-Dオプションでシステムプロパティを設定して動かしました。
$ mvn test -Dchromeoptions.args=headless
ヘッドレスモードで実行すると、起動はするのですが以下のエラーが出てきました。
環境的にはGUIの無いLinux上で動かしているのですが、ヘッドレスならXvfbはいらないはず…
WebDriverException: unknown error: an X display is required for keycode conversions, consider using Xvfb
エラーを調べていくと、以下のバグレポートを発見しました。
どうやらChromeDriverのバグで、sendKeys
がうまく動かない模様です。
(workaroundとして、JavaScriptで頑張ってsendKeys
などを利用しないようにすれば回避できるようですが、ちょっと面倒過ぎる…)
このバグのステータスはFixedになっており、ChromeDriver 2.31では直るようです。
ただし、記事投稿時点ではまだリリースされていません。(最新は2.30)
とりあえず直近はheadlessを利用せず、Xvfbで対応しておくのが良さそうです。
追記
記事を投稿したら、速攻で うらがみ⛄(@backpaper0)さん から以下のツイートが。
SelenideならfastSetValue=trueで回避できるかも?と思ったけどどうだろう(適当)( ˙꒳˙ )
— うらがみ⛄ (@backpaper0) July 24, 2017
調べるとfastSetValue
をtrue
にすると、Seleniumに組み込まれているsendKey
を利用せず、JavaScriptで実行するようになるとか。(用途としては、高速化目的なよう)
実際に適用してみると…テストが通る…!!
(workaroundとして、JavaScriptで頑張ってsendKeysなどを利用しないようにすれば回避できるようですが、ちょっと面倒過ぎる…)
て部分の対応を、fastSetValue=true
で見事に解決した模様。
しかし、パッとこの対応を思いつくうらがみさん凄い…\(^o^)/