Skip to content

Selenium WebDriver 403 Forbidden エラーの解決法

問題説明

Selenium WebDriver を用いたテストを Azure DevOps 上で実行する際、以下のエラーが発生するケースがあります:

log
2023-03-08T21:06:50.3292859Z WARNING: Invalid Status code=403 text=Forbidden
java.io.IOException: Invalid Status code=403 text=Forbidden
   at org.asynchttpclient.netty.handler.WebSocketHandler.abort(WebSocketHandler.java:92)
   ...

このエラーの特徴:

  • 403 Forbidden (アクセス拒否) が発生
  • ローカル環境では正常動作するが、Azure DevOps 環境で発生
  • ChromeDriver と Chrome ブラウザのバージョン 111 以降で顕著
  • WebSocket 接続時の認証エラーが原因

発生条件

特に以下の環境変更後に発生しやすい:

  • Chrome ブラウザのバージョン 111+ への更新
  • Azure DevOps パイプラインでのリモート実行
  • Selenium 4.5〜4.8 の使用

根本原因

Chrome 111 で導入されたセキュリティ強化により、WebSocket 接続のオリジンチェックが厳格化されました。これにより:

  1. デフォルトでローカルホストからの接続も制限対象に
  2. Selenium の HTTP クライアントが接続を拒否される
  3. devtools_http_handler がオリジン検証に失敗

エラーログ上では Rejected an incoming WebSocket connection というメッセージがヒントになります。

解決方法

方法1:ChromeOptions での設定追加(推奨)

java
// Chromeオプションにリモート接続許可を追加
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");

// ドライバー起動時にオプション指定
WebDriver driver = new ChromeDriver(options);

特徴

  • 即時性:コード変更だけで即時適用可能
  • 汎用性:すべての環境(DevOps/ローカル)で有効
  • 設定内容:* ですべてのオリジンを許可(必要に応じて特定オリジン指定可)

推奨シナリオ

  • 緊急対応が必要な場合
  • 環境依存の少ないシンプルな解決を求めている場合
  • ChromeDriverのバージョン変更が難しい場合

方法2:HTTPクライアントの変更(根本解決)

java
dependencies {
    implementation 'org.seleniumhq.selenium:selenium-java:4.8.2'
    implementation 'org.seleniumhq.selenium:selenium-http-jdk-client:4.8.2'
}
java
// HTTPクライアントファクトリーを設定
System.setProperty("webdriver.http.factory", "jdk-http-client");

// 通常通りドライバー初期化
WebDriver driver = new ChromeDriver();

特徴

  • JDK 11以降が必要
  • Selenium公式が推奨する最新クライアント
  • WebSocket接続問題を根本解決
  • 今後のバージョン互換性が高い

推奨シナリオ

  • JDK 11+ が利用可能な環境
  • 長期的な安定運用を目指す場合
  • Seleniumの最新機能を活用したい場合

方法3:ライブラリのバージョンアップ

xml
<!-- Selenide利用時 -->
<dependency>
    <groupId>com.codeborne</groupId>
    <artifactId>selenide</artifactId>
    <version>6.12.2</version> <!-- 修正版 -->
</dependency>

<!-- 通常のSelenium -->
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.9.0</version> <!-- 修正済みバージョン -->
</dependency>

特徴

  • Selenium 4.9.0+ では問題が修正済み
  • Selenide 6.12.2+ でも修正対応済み
  • 特別な設定が不要

注意点

  • プロジェクトの依存関係を精査
  • 他ライブラリとの互換性を確認

よくある疑問

Q. すべての方法を試しても解決しない場合は?

考慮すべき追加要因

  1. Azure DevOpsエージェントのネットワーク制限
  2. プロキシ設定(chromeOptions.addArguments("--proxy-server=...")
  3. VNet/ファイアウォールの接続設定
  4. ChromeとChromedriverのバージョン不一致(必ず同一バージョン使用を推奨)
bash
# ChromeとChromeDriverのバージョン確認
chromedriver --version
google-chrome --version

Q. --remote-allow-origins=* のセキュリティリスクは?

確かにすべてのオリジンを許可するため、開発環境では問題ありませんが、本番環境での使用は避けるべきです。代わりに:

java
// 特定オリジンのみ許可
options.addArguments("--remote-allow-origins=http://localhost:8080");

予防策とベストプラクティス

  1. バージョン固定

    bash
    # ChromeDriverのバージョン固定例
    WebDriverManager.chromedriver().driverVersion("111.0").setup();
  2. 依存関係の明示

    xml
    <!-- Mavenの例 -->
    <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-java</artifactId>
      <version>4.9.0</version> <!-- 固定バージョン指定 -->
    </dependency>
  3. Azure DevOpsパイプライン設定

    yaml
    steps:
    - script: |
        CHROME_VERSION=111.0.5563.41
        wget https://chromedriver.storage.googleapis.com/$CHROME_VERSION/chromedriver_linux64.zip
        unzip chromedriver_linux64.zip -d /usr/local/bin
      displayName: 'ChromeDriver インストール'

最終確認ポイント

  • [x] ChromeとChromeDriverのバージョン一致
  • [x] --remote-allow-origins または HTTPクライアント設定の適用
  • [x] Azure DevOpsエージェントにChromeインストール(必要なら)

公式参考情報:
ChromeDriver セキュリティガイド
Selenium 4.9.0 リリースノート