新しい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年にもっと良い解決策があることを望んでいます。事前に感謝します。
*編集Chromeはこれをサポートしなくなりました。
これは、アドレスにユーザー名とパスワードを追加することで処理できる「制限付き」ポップアップではありませんか?
driver.get("http://www.example.com/");
の代わりにdriver.get("http://username:[email protected]");
に移動します。
chrome拡張の助けを借りて、他の人がchromeのこの問題を解決するのに役立つかもしれません。このアイデアをくれた@SubjectiveRealityに感謝します。
https:// username:[email protected] のようなURLの一部としてユーザー名とパスワードを送信すると、同じサーバーが認証とアプリケーションのホストの両方を実行する場合に役立ちます。ただし、ほとんどの企業アプリケーションでは企業全体の認証が行われ、アプリサーバーは要求を認証サーバーに再ルーティングする場合があります。このような場合、URLで資格情報を渡すことは機能しません。
解決策は次のとおりです。
{"name": "Webrequest API"、 "version": "1.0"、 "description": "認証ウィンドウを処理するための拡張機能"、 "permissions":[""、 "webRequest"、 "webRequestBlocking"]、 "background" :{"scripts":["webrequest.js"]}、 "manifest_version":2}
chrome.webRequest.onAuthRequired.addListener( function handler(details){ return {'authCredentials': {username: "yourusername", password: "yourpassword"}}; }, {urls:["<all_urls>"]}, ['blocking']);
chromeブラウザを開き、chrome:// extensionsにアクセスして開発者モードを有効にします
「Pack Extension」をクリックし、「extension」としてルートディレクトリを選択し、拡張機能をパックします。拡張子が「.crx」のファイルを作成する必要があります
options.addExtensions(new File("path/to/extension.crx")); options.addArguments("--no-sandbox");
ハッピーテスト!
参照:
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
@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ポリシーで無効になっているためです。
*
に設定されているREG_SZ値を、たとえば-
に変更します。元の回答との唯一の違いは、URLもアクセス許可に存在する必要があることです。
追加
コンソール出力を表示する場合は、デベロッパーモードをオンにして、Chromeの拡張機能画面で拡張機能のInspect views background page
をクリックします
あなたの状況は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の値としてテストユーザーアカウントを利用しました。