Skip to content

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への移行時によく発生
java
// 典型的なスタックトレース断片
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つあります:

  1. セキュリティ制限の強化
    Chrome 111以降、WebDriverとブラウザ間の通信にクロスオリジン制限が適用されました

  2. SeleniumとChromeDriverのバージョン不整合
    互換性のないバージョン組み合わせで発生

  3. Javaランタイムの制限 (Java 8環境)
    Java 11+では発生しにくい傾向があります

技術的背景

ChromeのDevTools Protocol(CDP)がWebSocketを使用するようになり、--remote-allow-originsフラグがないと接続が拒否されます。これはブラウザセキュリティの強化による変更です。

解決方法

方法1: Chromeオプションで接続許可を追加(即効策)

java
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");  // 重要
WebDriver driver = new ChromeDriver(options);

注意

*はすべてのオリジンを許可するため、テスト環境限定で使用してください。本番環境では適切なオリジンを指定しましょう。

方法2: Seleniumバージョンを最新化(推奨)

Selenium 4.8.2以降ではこの問題が修正されています:

xml
<!-- 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のダウングレード

一時的な回避策として、安定したバージョンにダウングレード:

bash
# Chrome 105と対応するChromedriverを利用
chrome.version = 105
chromedriver.version = 105.0.5195.52

非推奨

この方法はセキュリティアップデートが適用されないため、あくまで一時的な回避策としてのみ使用してください。

Edgeブラウザの場合の設定

java
EdgeOptions options = new EdgeOptions();
options.addArguments("--remote-allow-origins=*");
options.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
WebDriver driver = new EdgeDriver(options);

根本解決のベストプラクティス

  1. 依存関係の最新化
    Selenium → 常に最新安定版 (4.10.0+)
  2. ランタイム環境の更新
    Java 11または17へ移行
  3. バージョン互換性チェック
    ChromeDriver互換表を参照
  4. 設定の一元化
    テスト環境ごとにChromeOptionsを管理するヘルパークラスを作成
java
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を利用する方法(根本解決ではない):

xml
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.141.59</version>  <!-- 互換性モード -->
</dependency>

結論

Unable to establish websocket connectionエラーに対する最適な解決策は:

  1. Selenium 4.8.2以降へ更新
    バージョン情報(2024年6月時点):

    bash
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.15.0</version>
    </dependency>
  2. やむを得ない場合のみ--remote-allow-origins=*オプションを付加
    Java実装:

    java
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--remote-allow-origins=*"); 
    WebDriver driver = new ChromeDriver(options);

補足:ローカル環境で問題が解決しない場合、ネットワーク設定(プロキシ/ファイアウォール)やDNSキャッシュを確認してください。公式トラブルシューティングガイドも参照すると効果的です。