web-dev-qa-db-ja.com

ChromeでSelenium WebDriverでJavaを使用して認証ポップアップを処理する方法

新しいWebdriverスクリプトの1つで認証ポップアップを処理しようとしています。 IEには有効なソリューションがありますが、Chromeで苦労しています。 IEは[このページ]のアドバイスに従うのと同じくらい簡単でした: Javaを使用してSelenium WebDriverで認証ポップアップを処理する方法 。そのスレッドは優れたソリューションを示していません。 Chromeの場合、いくつかのコメントは指摘していますが、このソリューションはChromeでは機能しません。問題は、Chromeで以下のコードを実行しようとすると、ログインポップアップがアラートではないことです。

 WebDriverWait wait = new WebDriverWait(driver, 10);      
 Alert alert = wait.until(ExpectedConditions.alertIsPresent());     
 alert.authenticateUsing(new UserAndPassword(**username**, **password**));

Windowsレベル()の認証ポップアップではなく、Webページは単にパスワードで保護されています。 Stack Overflowにはこの質問の他のインスタンスがいくつかあることは知っていますが、2年以上前には表示されません。私は2017年にもっと良い解決策があることを望んでいます。事前に感謝します。

10
Travis Needham

*編集Chromeはこれをサポートしなくなりました。

これは、アドレスにユーザー名とパスワードを追加することで処理できる「制限付き」ポップアップではありませんか?

driver.get("http://www.example.com/");の代わりにdriver.get("http://username:[email protected]");に移動します。

chrome拡張の助けを借りて、他の人がchromeのこの問題を解決するのに役立つかもしれません。このアイデアをくれた@SubjectiveRealityに感謝します。

https:// username:[email protected] のようなURLの一部としてユーザー名とパスワードを送信すると、同じサーバーが認証とアプリケーションのホストの両方を実行する場合に役立ちます。ただし、ほとんどの企業アプリケーションでは企業全体の認証が行われ、アプリサーバーは要求を認証サーバーに再ルーティングする場合があります。このような場合、URLで資格情報を渡すことは機能しません。

解決策は次のとおりです。

ステップ1:chrome拡張機能を作成する

  1. 「extension」という名前のフォルダーを作成します
  2. 「extension」フォルダー内に「manifest.json」という名前のファイルを作成します。以下のコードをファイルにコピーして保存します。

{"name": "Webrequest API"、 "version": "1.0"、 "description": "認証ウィンドウを処理するための拡張機能"、 "permissions":[""、 "webRequest"、 "webRequestBlocking"]、 "background" :{"scripts":["webrequest.js"]}、 "manifest_version":2}

  1. 「extension」フォルダー内に「webrequest.js」という名前のファイルを作成し、以下のコードをファイルにコピーして貼り付けて保存します。
chrome.webRequest.onAuthRequired.addListener(
function handler(details){
 return {'authCredentials': {username: "yourusername", password: "yourpassword"}};
},
{urls:["<all_urls>"]},
['blocking']);
  1. chromeブラウザを開き、chrome:// extensionsにアクセスして開発者モードを有効にします

  2. 「Pack Extension」をクリックし、「extension」としてルートディレクトリを選択し、拡張機能をパックします。拡張子が「.crx」のファイルを作成する必要があります

ステップ2:テスト自動化フレームワークに拡張機能を追加する

  1. .crxファイルをフレームワークにコピーします
  2. 次のような拡張機能をロードするようにWebdriverの作成を構成します
options.addExtensions(new File("path/to/extension.crx"));
options.addArguments("--no-sandbox");
  1. WebdriverとアプリケーションURLを呼び出します
  2. 上記の拡張機能によって処理される認証ポップアップが表示されることはありません

ハッピーテスト!

参照:

http://www.adambarth.com/experimental/crx/docs/webRequest.html#apiReferencehttps://developer.chrome.com/extensions/webRequest#event-onAuthRequiredchrome.webRequest.onAuthRequired Listenerhttps://Gist.github.com/florentbr/25246cd9337cebc07e2bbb0b9bf0de46

5
Bhuvanesh Mani

@Bhuvanesh Maniが提供するソリューションの回答を更新

manifest.json


    {
        "name": "Webrequest API",
        "version": "1.0",
        "description": "Extension to handle Authentication window",
        "permissions": [
            "webRequest",
            "webRequestBlocking",
            "<all_urls>"
        ],
        "background": {
            "scripts": [
                "webrequest.js"
            ]
        },
        "manifest_version": 2
    }

webrequest.js


    chrome.webRequest.onAuthRequired.addListener(function(details){
        console.log("chrome.webRequest.onAuthRequired event has fired");
        return {
                authCredentials: {username: "yourusername", password: "yourpassword"}
            };
    },
    {urls:["<all_urls>"]},
    ['blocking']);

「--no sandbox」オプションが必要な理由は定かではありませんが、私にとってはこれは必要ありません。

拡張機能の追加を許可するには、レジストリ編集を実行する必要がありました。これは、企業ADポリシーで無効になっているためです。

  • Regedit.exeを管理者として開きます
  • computer\HKEY_USERS \に移動します
  • 現在*に設定されているREG_SZ値を、たとえば-に変更します。
  • 拡張機能を追加するchromeインスタンスを再起動します。

元の回答との唯一の違いは、URLもアクセス許可に存在する必要があることです。

追加
コンソール出力を表示する場合は、デベロッパーモードをオンにして、Chromeの拡張機能画面で拡張機能のInspect views background pageをクリックします

0
obiwankoban

あなたの状況はJavaですが、これは役に立つかもしれません。私はC#でこのアプローチを使用してアラートを通過することができました:

// I am using a static instance of the driver for this.
Driver.Instance.Navigate().GoToUrl(url);
var alert = Driver.Instance.SwitchTo().Alert();
alert.SendKeys($"{Driver.user_name}" + Keys.Tab + $"{Driver.user_password}" + Keys.Tab);
alert.Accept();
Driver.Instance.SwitchTo().DefaultContent();

次に、user_nameとpasswordの値としてテストユーザーアカウントを利用しました。

0
joshmcode