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 接続のオリジンチェックが厳格化されました。これにより:
- デフォルトでローカルホストからの接続も制限対象に
- Selenium の HTTP クライアントが接続を拒否される
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. すべての方法を試しても解決しない場合は?
考慮すべき追加要因:
- Azure DevOpsエージェントのネットワーク制限
- プロキシ設定(
chromeOptions.addArguments("--proxy-server=...")
) - VNet/ファイアウォールの接続設定
- ChromeとChromedriverのバージョン不一致(必ず同一バージョン使用を推奨)
bash
# ChromeとChromeDriverのバージョン確認
chromedriver --version
google-chrome --version
Q. --remote-allow-origins=*
のセキュリティリスクは?
確かにすべてのオリジンを許可するため、開発環境では問題ありませんが、本番環境での使用は避けるべきです。代わりに:
java
// 特定オリジンのみ許可
options.addArguments("--remote-allow-origins=http://localhost:8080");
予防策とベストプラクティス
バージョン固定
bash# ChromeDriverのバージョン固定例 WebDriverManager.chromedriver().driverVersion("111.0").setup();
依存関係の明示
xml<!-- Mavenの例 --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.9.0</version> <!-- 固定バージョン指定 --> </dependency>
Azure DevOpsパイプライン設定
yamlsteps: - 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インストール(必要なら)