GUIの無いLinux上でSeleniumからHeadless Chromeを使うとsendKeysでエラーになる

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);

https://thefriendlytester.co.uk/2017/04/new-headless-chrome-with-selenium.html

自身は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)さん から以下のツイートが。

調べるとfastSetValuetrueにすると、Seleniumに組み込まれているsendKeyを利用せず、JavaScriptで実行するようになるとか。(用途としては、高速化目的なよう)

実際に適用してみると…テストが通る…!!

(workaroundとして、JavaScriptで頑張ってsendKeysなどを利用しないようにすれば回避できるようですが、ちょっと面倒過ぎる…)

て部分の対応を、fastSetValue=trueで見事に解決した模様。
しかし、パッとこの対応を思いつくうらがみさん凄い…\(^o^)/

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.