LoginSignup
4
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-24

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

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

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

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

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

4
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3