Chrome 111でSelenium(Java)がエラーになる現象の対処
Titusさん(Seleniumプロジェクトメンバー)のツイートの通りなのですが、Chrome 111 でSelenium(Java)を使おうとした場合、WebDriverの起動時にエラーが発生するようになっています。
日本語で言及している方があんまりいなさそうだったので、この記事ではこのエラーの対処方法について解説します。
原因
このエラーはJava向けのSeleniumでのみ発生します。
SeleniumではChromeのDevtoolsと通信を行っています。Chrome 111でこの通信の仕様が少し変更になったのですが、Seleniumが使っているHTTP Clientがこれに対応できないためエラーとなります。HTTP ClientはJava 8への対応維持から古いライブラリが使われており、このライブラリは現在メンテナンスがされていないそうです。
Java 11, 17以上の場合
前述の問題からSeleniumのHTTP Clientをアップデートするプロジェクトが動いています。Java 11からは標準ライブラリでWebSocketまで対応可能なのでそちらを使うようです。これは以下の手順で有効化でき、有効化によって前述のエラーは回避できます。
依存ライブラリの追加
Mavenの場合
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.8.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-http-jdk-client</artifactId>
<version>4.8.1</version>
</dependency>
Gradleの場合
dependencies {
testImplementation 'org.seleniumhq.selenium:selenium-java:4.8.1'
testImplementation 'org.seleniumhq.selenium:selenium-http-jdk-client:4.8.1'
}
コードの変更
WebDriver
の初期化前に System.setProperty("webdriver.http.factory", "jdk-http-client");
を追加します。
System.setProperty("webdriver.http.factory", "jdk-http-client");
WebDriver driver = new ChromeDriver();
この状態で起動すると新しいHTTP Clientが使用され、エラーを回避できます。
Java 8の場合
Java 8の場合HTTP Clientの変更ができないため、Chromeの設定を変更します。以下の引数を指定することでエラーが回避できます。
ただしこの設定はわずかにセキュリティリスクが発生するため[1]、可能ならJava 11以上にアップデートすることを推奨しています。
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver driver = new ChromeDriver(options);
まとめ
Chrome 111でのエラーを回避する方法を紹介しました。Seleniumプロジェクトでは近い将来にJava 8のサポートを終了することを検討しているそうです。これを機にJava 11以上にアップデートするのも良いでしょう。
-
実際に問題になることはほぼないです ↩︎
Discussion