Ich versuche, ein Authentifizierungs-Popup in einem meiner neuen Webdriver-Skripts zu behandeln. Ich habe eine funktionierende Lösung für IE, aber ich habe Probleme mit Chrome. IE war so einfach wie der Ratschlag auf [dieser Seite]: So behandeln Sie das Authentifizierungs-Popup mit Selenium WebDriver mit Java . In diesem Thread wird keine großartige Lösung für Chrome angezeigt, obwohl einige Kommentatoren darauf hinweisen, dass die Lösung für Chrome nicht funktioniert. Das Problem ist, wenn Sie versuchen, den folgenden Code in Chrome auszuführen, ist das Anmelde-Popup keine Warnung.
WebDriverWait wait = new WebDriverWait(driver, 10);
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
alert.authenticateUsing(new UserAndPassword(**username**, **password**));
Es handelt sich nicht um ein Popup-Fenster auf Windows-Ebene (), die Webseite ist lediglich durch ein Kennwort geschützt. Ich weiß, dass es einige andere Fälle dieser Frage zu Stack Overflow gibt, aber ich sehe keine neueren als 2 Jahre alt. Ich hoffe, dass es 2017 eine bessere Lösung gibt. Vielen Dank im Voraus.
* edit Chrome unterstützt dies nicht mehr.
Ist das nicht ein "eingeschränktes" Popup, das behandelt werden kann, indem der Adresse ein Benutzername und ein Kennwort vorangestellt werden?
Anstelle von driver.get("http://www.example.com/");
gehen Sie zu driver.get("http://username:[email protected]");
.
Möglicherweise hilfreich für andere, um dieses Problem in chrome mit Hilfe der Erweiterung chrome) zu lösen. Vielen Dank an @SubjectiveReality, der mir diese Idee gegeben hat.
Das Senden von Benutzername und Kennwort als Teil einer URL wie https: // Benutzername: [email protected] kann hilfreich sein, wenn derselbe Server sowohl die Authentifizierung durchführt als auch die Anwendung hostet. Die meisten Unternehmensanwendungen verfügen jedoch über unternehmensweite Authentifizierungen, und der App-Server leitet die Anforderung möglicherweise an Authentifizierungsserver weiter. In solchen Fällen funktioniert es nicht, Anmeldeinformationen in der URL zu übergeben.
Hier ist die Lösung:
{"name": "Webrequest API", "version": "1.0", "description": "Erweiterung zur Behandlung des Authentifizierungsfensters", "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']);
Öffne chrome browser, gehe zu chrome: // extensions und aktiviere den Entwicklermodus
Klicken Sie auf 'Erweiterung packen', wählen Sie das Stammverzeichnis als 'Erweiterung' und packen Sie die Erweiterung. Es sollte eine Datei mit der Erweiterung ".crx" erstellen
options.addExtensions(new File("path/to/extension.crx")); options.addArguments("--no-sandbox");
Viel Spaß beim Testen!
Referenzen:
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
Aktualisierte Antwort auf die von @Bhuvanesh Mani bereitgestellte Lösung
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']);
Nicht sicher, warum die Option '--no sandbox' erforderlich ist, aber für mich ist dies nicht erforderlich.
Ich musste eine Registrierungsbearbeitung durchführen, um das Hinzufügen von Erweiterungen zu ermöglichen, da dies mit einer Unternehmens-AD-Richtlinie deaktiviert ist:
*
Festgelegt ist, beispielsweise auf -
.Der einzige Unterschied zur ursprünglichen Antwort sind die URLs, die auch in den Berechtigungen vorhanden sein müssen.
extra's
Wenn Sie die Konsolenausgabe sehen möchten, aktivieren Sie den Entwicklermodus und klicken Sie im Erweiterungsbildschirm von Chrome auf Inspect views background page
für Ihre Erweiterung
Ich weiß, dass Ihre Situation Java ist, aber dies könnte hilfreich sein. Ich konnte die Warnung mit diesem Ansatz in C # umgehen:
// 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();
Ich habe dann ein Testbenutzerkonto als Werte für Benutzername und Kennwort verwendet.