it-swarm.com.de

So behandeln Sie das Authentifizierungs-Popup in Chrome mit Selenium WebDriver mithilfe von Java

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.

8
Travis Needham

* 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:

Schritt 1: Erstellen Sie die Erweiterung chrome

  1. Erstelle einen Ordner mit dem Namen 'extension'
  2. Erstellen Sie eine Datei mit dem Namen "manifest.json" im Ordner "extension". Kopieren Sie den folgenden Code in die Datei und speichern Sie ihn.

{"name": "Webrequest API", "version": "1.0", "description": "Erweiterung zur Behandlung des Authentifizierungsfensters", "permissions": ["", "webRequest", "webRequestBlocking"], "background" : {"scripts": ["webrequest.js"]}, "manifest_version": 2}

  1. Erstellen Sie eine Datei mit dem Namen 'webrequest.js' im Ordner 'extension' und kopieren Sie den folgenden Code in die Datei und speichern Sie sie.
chrome.webRequest.onAuthRequired.addListener(
function handler(details){
 return {'authCredentials': {username: "yourusername", password: "yourpassword"}};
},
{urls:["<all_urls>"]},
['blocking']);
  1. Öffne chrome browser, gehe zu chrome: // extensions und aktiviere den Entwicklermodus

  2. 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

Schritt 2: Fügen Sie eine Erweiterung zu Ihrem Testautomatisierungs-Framework hinzu

  1. Kopieren Sie die CRX-Datei in Ihr Framework
  2. Konfigurieren Sie Ihre Webdriver-Erstellung so, dass die Erweiterung wie folgt geladen wird
options.addExtensions(new File("path/to/extension.crx"));
options.addArguments("--no-sandbox");
  1. Rufen Sie Ihren Webdriver und die Anwendungs-URL auf
  2. Das Authentifizierungs-Popup wird nicht so angezeigt, wie es von der obigen Erweiterung behandelt wird

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

5
Bhuvanesh Mani

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:

  • Öffnen Sie regedit.exe als admin
  • navigieren Sie zu Computer\HKEY_USERS \
  • Ändern Sie den REG_SZ-Wert, der jetzt auf * Festgelegt ist, beispielsweise auf -.
  • starten Sie die Instanz chrome, in der Sie Erweiterungen hinzufügen möchten.

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

0
obiwankoban

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.

0
joshmcode