Seleniumにおけるプロキシ認証は、Webページではなくブラウザがユーザー名とパスワードを要求する場合に困難になります。適切な解決策は、プロキシの種類、ブラウザ、Seleniumのバージョン、そして認証情報をテストの外部から提供できるかどうかによって異なります。このガイドでは、信頼性の高いSelenium 4のアプローチ、従来の回避策が依然として有効な場合、そしてアラート処理コードがしばしば失敗する理由について説明します。

プロキシとは何ですか?

プロキシとは、ブラウザに代わってウェブサイトにリクエストを送信する仲介役です。宛先側では、Seleniumを実行しているマシンではなく、プロキシのIPアドレスが表示されます。テストチームは、プロキシを使用して地域ごとのエクスペリエンスを検証したり、制御されたネットワーク経由でトラフィックをルーティングしたり、リクエストを検査したり、自動化されたワークロードを分散させたりします。

プロキシ URL には、通常、ホストとポートが含まれます。 proxy.example.test:8080プライベートサービスでは、ユーザー名とパスワードが必要になる場合もあります。Seleniumはブラウザオプションを通じてプロキシエンドポイントを設定できますが、認証プロンプトはブラウザによって制御されるため、通常のHTMLフォームのようにWebDriverに常に公開されるとは限りません。

適切なネットワークを選択してください。 静的アドレスは許可リスト作成に便利ですが、ローテーションネットワークは大規模な収集に適しています。 住宅用プロキシプロバイダーガイド 具体的な違いを説明します。

自動化は、許可を得ている場合にのみ使用し、ウェブサイトの利用規約を遵守し、認証情報をソースコードやテストログに含めないようにしてください。

SOCKS と HTTP プロキシの違い

HTTPプロキシはWebトラフィックを理解し、通常はHTTPとHTTPSの値を別々に設定します。SOCKSプロキシはより低レベルで動作し、アプリケーションプロトコルを解釈することなく、さまざまな種類のTCPトラフィックを伝送できます。SOCKS5はさらに認証をサポートしており、通常は推奨されるSOCKSバージョンです。

特性HTTP/HTTPSプロキシSOCKS5プロキシ
トラフィックブラウザのWebリクエスト向けに設計されています複数のTCPベースのアプリケーションと連携します。
プロトコルの認識HTTPリクエストとヘッダーを理解するHTTPセマンティクスを読み取らずにトラフィックを転送する
SeleniumのセットアップHTTPおよびSSLプロキシフィールドを設定しますSOCKSエンドポイントとバージョンを設定します
典型的な使用ウェブテスト、フィルタリング、キャッシング、検査柔軟なトンネリングと非HTTPトラフィック

ブラウザとプロキシプロバイダは同じメソッドをサポートしている必要があります。有効なエンドポイントであっても、Seleniumがネイティブのユーザー名/パスワード入力ダイアログを自動的に完了できるとは限りません。

Chrome の Selenium WebDriver でプロキシを処理する方法

対話型認証を必要としないプロキシの場合、Selenium 4 は Proxy 反対する ChromeOptions。 現在 Seleniumの公式ブラウザオプションに関するドキュメント これは、能力に基づいたアプローチを実証するものです。

import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

Proxy proxy = new Proxy();
proxy.setHttpProxy("proxy.example.test:8080");
proxy.setSslProxy("proxy.example.test:8080");

ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);

WebDriver driver = new ChromeDriver(options);
driver.get("https://example.com");

SOCKS5の場合は、代わりにSOCKSエンドポイントとバージョンを設定してください。

Proxy proxy = new Proxy();
proxy.setSocksProxy("proxy.example.test:1080");
proxy.setSocksVersion(5);

ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);

認証付きプロキシには、より綿密な計画が必要です。URLに認証情報を埋め込むと、最新のブラウザで拒否される可能性があり、機密情報が漏洩する恐れがあります。以下の方法を推奨します。

  1. IP 許可リスト: ブラウザダイアログが表示されないように、CIランナーまたはSelenium Gridノードの固定パブリックIPを認証してください。
  2. ローカルゲートウェイ: テストマシン上に信頼できる転送プロキシを配置します。Seleniumは認証情報なしでローカルに接続し、ゲートウェイがアップストリームで認証を行います。
  3. 制御されたブラウザ拡張機能: プロキシを設定し、認証の要求に応答する内部Chrome拡張機能を作成します。この拡張機能は、保護されたテストアーティファクトからのみロードします。
  4. グリッドレベルの設定: 認証情報を各テストに配布するのではなく、Seleniumノード上でネットワークとシークレットを設定してください。

認証情報は、シークレットマネージャまたは環境固有のテスト構成から読み取ってください。決してGitにコミットしたり、コンソール出力に表示したり、スクリーンショットに含めたりしないでください。起動後、テストスイートを続行する前に、承認済みのテストエンドポイントで終了IPアドレスを確認してください。

よくある失敗: ERR_PROXY_CONNECTION_FAILED 通常、ホスト、ポート、プロトコル、またはネットワークパスが間違っていることを示します。 407 Proxy Authentication Required 応答は、認証情報が不足しているか、拒否されたことを示しています。

AutoItツールを使用する

AutoItは、ウィンドウの位置を特定し、認証情報を入力し、ボタンを押すことで、Windowsダイアログを自動化できます。かつては、WebDriverがブラウザ所有の認証ウィンドウを操作できなかったため、Seleniumの一般的な回避策として利用されていました。

この方法は脆弱です。Windows専用であり、ロック解除された対話型デスクトップが必要で、ウィンドウのタイトルとタイミングに依存し、ヘッドレスコンテナやリモートCIエージェントでは通常失敗します。また、スクリプトやプロセス引数を介してパスワードが漏洩する可能性もあります。

レガシー環境で他に選択肢がない場合は、AutoItスクリプトをコンパイルし、管理されたテスト成果物の場所に保存し、実行時に安全に認証情報を取得し、固定スリープを使用するのではなく、正確なダイアログが表示されるまで待機します。この手法は、隔離されたWindowsランナーに限定してください。保守性の高いスイートの場合は、IPアドレスの許可リスト、ゲートウェイ、または中央で構成されたGridノードの方が安全な選択肢です。

アラートの使用

Seleniumは、ウェブページコードによって生成されたJavaScriptアラートを処理できます。

Alert alert = new WebDriverWait(driver, Duration.ofSeconds(10))
    .until(ExpectedConditions.alertIsPresent());
alert.accept();

しかし、プロキシ認証ダイアログは通常、ブラウザのクロームであり、JavaScriptのアラートではありません。したがって、 driver.switchTo().alert() よく投げる NoAlertPresentException 認証情報の入力画面が表示されている場合でも同様です。この制限は、多くのHTTP基本認証ダイアログにも適用されます。

WebDriverがプロンプトを認識することを確認してから、アラートAPIを使用してください。認識しない場合は、ネットワーク設定でプロンプトを削除するか、上記で説明した認証プロキシ方式のいずれかを使用してください。これは、Seleniumが検査できないウィンドウとキーストロークを連携させるよりも安定しています。

よくあるご質問

Seleniumはプロキシを直接設定できますか?

はい。Selenium 4 は、ブラウザのオプションとプロキシ機能を通じて HTTP、SSL、または SOCKS の設定を渡すことができます。これによりエンドポイントは構成されますが、ブラウザが所有する認証プロンプトを完了できない場合があります。

Chromeでusername:password@host:portが失敗する理由は?

最新のブラウザはURLに埋め込まれた認証情報をブロックする可能性があり、また、その構文はログや履歴に機密情報を漏洩させる恐れがあります。代わりに、IPアドレスの許可リスト、セキュアゲートウェイ、または管理されたテスト環境を使用してください。

SeleniumはswitchTo().alert()を使ってプロキシログインを処理できますか?

通常はそうではありません。プロキシ認証は一般的にJavaScriptのアラートではなくブラウザのUIで行われるため、WebDriverはアラートが存在しないと報告する場合があります。

ヘッドレス版Chromeでプロキシ認証は機能しますか?

対話型プロンプトなしで認証が解決される場合は、この方法は有効です。IPアドレスの許可リスト、ローカルゲートウェイ、またはノードレベルの設定は、ヘッドレス実行に適しています。

Seleniumのプロキシ認証にAutoItを使うべきでしょうか?

制約のある従来のWindowsワークフローでのみ使用してください。CI環境では不安定で、ネットワーク設定でダイアログを削除するよりもセキュリティが劣ります。

ブラウザの自動化に最適なプロキシの種類はどれですか?

承認されたタスクによって異なります。HTTPプロキシはWebトラフィックにはシンプルで、SOCKS5は柔軟性が高く、住宅用ネットワークは位置情報テストに役立ちます。プロキシの種類については、弊社のプロキシタイプガイドで各オプションを比較してください。