Selenium Java と HtmlUnit Driver を使ってヘッドレスなUIテストを実装した際にはまったポイントをまとめています。
検証したバージョン
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>htmlunit-driver</artifactId>
<version>2.29.0</version>
</dependency>
(1) 要素のクリックができない
現象
要素をクリックするために WebElement#click
を呼び出すと、標準出力に Exception invoking getScreenY
という文字列が出力され、クリック処理が実行されない。
原因・解決策
実際には以下の例外が発生して、それがキャッチされて上記の文字列が出力されている。
java.lang.NoSuchMethodError: org.apache.commons.lang3.StringUtils.countMatches(Ljava/lang/CharSequence;C)I
この例外はCommons Langのバージョンが古いため、HtmlUnitが利用しているメソッドが存在しないことで発生している。
解決するには、mvn dependency:tree
もしくは依存関係のドキュメントを参照して、HtmlUnitが依存するCommons Langのバージョンに合わせればよい。(HtmlUnit2.29の場合は Commons Lang 3.7)
(2) NoClassDefFoundErrorが発生する
現象
テストを実行すると以下のスタックトレースが出力される。
java.lang.NoClassDefFoundError: org/apache/http/cookie/CookieSpecProvider
at com.gargoylesoftware.htmlunit.WebClient.createWebConnection(WebClient.java:2060)
...
原因・解決策
この問題もHtmlUnitが依存するHttpClientのバージョンが古いことが原因のため、バージョンを合わせればよい。(HtmlUnit 2.29 の場合はHttpClientLang 4.5.3)