Selenide/WebDriverでのWebSocket接続エラー解決
問題概要
SelenideやSelenium WebDriverを使用した自動テスト実行中に、以下のエラーが発生するケースがあります:
org.openqa.selenium.remote.http.ConnectionFailedException:
Unable to establish websocket connection to
http://localhost:2757/devtools/browser/uuid
主な特徴:
- ChromeブラウザとのWebSocket接続が確立できない
- 発生環境: Selenium 4.4.0、Chrome/Chromiumブラウザ、Java 8+
- テスト開始直後やブラウザ初期化時に発生
- 特にSelenium 3.xから4.xへの移行時によく発生
// 典型的なスタックトレース断片
at org.openqa.selenium.remote.http.netty.NettyWebSocket.<init>(NettyWebSocket.java:102)
at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:114)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:81)
根本原因
このエラーの主な原因は3つあります:
セキュリティ制限の強化
Chrome 111以降、WebDriverとブラウザ間の通信にクロスオリジン制限が適用されましたSeleniumとChromeDriverのバージョン不整合
互換性のないバージョン組み合わせで発生Javaランタイムの制限 (Java 8環境)
Java 11+では発生しにくい傾向があります
技術的背景
ChromeのDevTools Protocol(CDP)がWebSocketを使用するようになり、--remote-allow-origins
フラグがないと接続が拒否されます。これはブラウザセキュリティの強化による変更です。
解決方法
方法1: Chromeオプションで接続許可を追加(即効策)
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*"); // 重要
WebDriver driver = new ChromeDriver(options);
注意
*
はすべてのオリジンを許可するため、テスト環境限定で使用してください。本番環境では適切なオリジンを指定しましょう。
方法2: Seleniumバージョンを最新化(推奨)
Selenium 4.8.2以降ではこの問題が修正されています:
<!-- Maven依存関係の更新 -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.15.0</version> <!-- 最新安定版を指定 -->
</dependency>
メリット:
--remote-allow-origins
オプションを自動追加- Java 11+環境で最適化された動作
- 他の互換性問題も同時に解決可能
方法3: Chrome/Chromedriverのダウングレード
一時的な回避策として、安定したバージョンにダウングレード:
# Chrome 105と対応するChromedriverを利用
chrome.version = 105
chromedriver.version = 105.0.5195.52
非推奨
この方法はセキュリティアップデートが適用されないため、あくまで一時的な回避策としてのみ使用してください。
Edgeブラウザの場合の設定
EdgeOptions options = new EdgeOptions();
options.addArguments("--remote-allow-origins=*");
options.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
WebDriver driver = new EdgeDriver(options);
根本解決のベストプラクティス
- 依存関係の最新化
Selenium → 常に最新安定版 (4.10.0+) - ランタイム環境の更新
Java 11または17へ移行 - バージョン互換性チェック
ChromeDriver互換表を参照 - 設定の一元化
テスト環境ごとにChromeOptionsを管理するヘルパークラスを作成
public class BrowserConfig {
public static ChromeOptions getChromeOptions() {
ChromeOptions options = new ChromeOptions();
// 共通オプションを設定
options.addArguments("--remote-allow-origins=*");
options.addArguments("--start-maximized");
return options;
}
}
// 呼び出し側
WebDriver driver = new ChromeDriver(BrowserConfig.getChromeOptions());
回避策(非推奨)
古いバージョンのSeleniumを利用する方法(根本解決ではない):
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version> <!-- 互換性モード -->
</dependency>
結論
Unable to establish websocket connection
エラーに対する最適な解決策は:
Selenium 4.8.2以降へ更新
バージョン情報(2024年6月時点):bash<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.15.0</version> </dependency>
やむを得ない場合のみ
--remote-allow-origins=*
オプションを付加
Java実装:javaChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); WebDriver driver = new ChromeDriver(options);
補足:ローカル環境で問題が解決しない場合、ネットワーク設定(プロキシ/ファイアウォール)やDNSキャッシュを確認してください。公式トラブルシューティングガイドも参照すると効果的です。