web-dev-qa-db-de.com

HTTP Basic Auth via URL in Firefox funktioniert nicht?

Ich weiß, dass Sie sich normalerweise bei Websites anmelden können, die eine HTTP-Basisauthentifizierung mit Selenium erfordern, indem Sie den Benutzernamen und das Kennwort in die URL eingeben, z.

Selenium.open("http://myusername:[email protected]/mypath");

Ich habe mit Firefox 2 oder 3 einen Selenium-Test durchgeführt und erhalte dort immer noch das Dialogfenster "Authentifizierung erforderlich"?

Update: Es scheint kein Selenium-Problem zu sein, sondern ein Firefox-Problem. Wenn ich die URL manuell in FF eingebe, wird der Authentifizierungsdialog angezeigt. Wenn ich jedoch die URL in Opera eingebe, wird meine Seite angezeigt, ohne dass ein Authentifizierungsdialog angezeigt wird.

18
Peter

Als Beitrag zu Druskas Antwort können Sie dieselbe Konfiguration mit der Selenium 2 API vornehmen:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.http.phishy-userpass-length", 255);
profile.setPreference("network.automatic-ntlm-auth.trusted-uris","yourDomain");
new FirefoxDriver(profile);

Dieser Ansatz ist einfacher und Sie müssen nicht jeden Entwickler bitten, seine Firefox-Konfiguration zu ändern. Ich habe nur mit dem Firefox-Treiber getestet.

UPDATE:

Aus irgendeinem Grund (möglicherweise den unter https://stackoverflow.com/a/14348701/256245 erläuterten), funktioniert die oben genannte Lösung nicht mit neueren Versionen von Firefox. Folgendes funktioniert jetzt für mich (getestet mit Firefox 19.0.2):

  1. Installiere AutoAuth Firefox-Plugin;
  2. Besuchen Sie die Website, auf der die Authentifizierung erforderlich ist. Geben Sie Ihren Benutzernamen und Ihr Passwort ein und vergewissern Sie sich, dass Sie die Anmeldeinformationen speichern.
  3. Speichern Sie die AutoAuth-Installationsdatei auf Ihrer Festplatte: Klicken Sie auf der Plugin-Seite mit der rechten Maustaste auf „Zu Firefox hinzufügen“ und „Link speichern unter“.
  4. Firefox-Webtreiber wie folgt instanziieren:

    FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default");
    File pluginAutoAuth = new File("src/test/resources/autoauth-2.1-fx+fn.xpi");
    firefoxProfile.addExtension(pluginAutoAuth);
    return new FirefoxDriver(firefoxProfile);
    

Stellen Sie sicher, dass die pluginAutoAuth-Datei mit dem korrekten Pfad instanziiert wird, in dem Sie die Plugin-Installation gespeichert haben. Wenn Sie mit dem Standardprofil nicht zufrieden sind, können Sie den Firefox Profile Manager verwenden und einen für Ihre Tests spezifischen Test erstellen.

Verweis auf diese neue Lösung: http://watirmelon.com/2012/06/27/automatic-firefox-authentication-when-using-Selenium-webdriver-with-autoauth/

11
Fabricio Lemos

Ich habe eine Lösung für Firefox und Internet Explorer.

Für Firefox müssen Sie in about: config die Ganzzahl network.http.phishy-userpass-length mit einer Länge von 255 erstellen. Dadurch wird Firefox angewiesen, keine Authentifizierung anzuzeigen Feld, wenn der Benutzername und das Kennwort weniger als 255 Zeichen enthalten. Sie können jetzt http: // user: [email protected] verwenden, um sich zu authentifizieren.

Für Internet Explorer müssen Sie die Registrierung bearbeiten. Erstellen Sie im Schlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE die DWORD-Werte iexplore.exe und Explorer.exe und stellen Sie sicher, dass dies der Fall ist ihre Werte sind 0 .

Ich musste auch die NTLM-Authentifizierung überschreiben. Um die NTLM-Authentifizierung mit der HTTP-Basisauthentifizierungssyntax in Firefox zu authentifizieren, geben Sie einfach die Domänen an, die in der Firefox-Konfigurationszeichenfolge network.automatic-ntlm-auth.trusted-uris (zusammen mit der ersten Konfigurationsoption) verwendet werden. Dies funktioniert in IE mit der Registrierungsbearbeitung allein.

10
Druska

Fügen Sie nach dem Kontextstamm einen Schrägstrich hinzu:

Anstelle von: Selenium.open("http://myusername:[email protected]/mypath");

verwenden Sie: Selenium.open("http://myusername:[email protected]/mypath/");

Es macht den Unterschied, dass die Welt den Schrägstrich am Ende der Kontextwurzel hinzufügt. Ohne den Schrägstrich öffnet sich das Popup, mit dem Schrägstrich wird es wie erwartet authentifiziert.

Beachten Sie, dass dies ist kein Selenium-Fehler oder was nicht, sondern ein Firefox-Ding. Sie können Ihre Befehlszeile auch verwenden, um sich selbst zu überzeugen:

 C:\Program Files\Mozilla Firefox>firefox http://myusername:[email protected]/mypath/

Bei mir funktioniert es auch ohne Einstellungen der Netzwerke uris:

FirefoxProfile profile = new FirefoxProfile();
//profile.setPreference("network.automatic-ntlm-auth.trusted-uris", "mydomain.com");
//profile.setPreference("network.negotiate-auth.trusteduris", "mydomain.com");

WebDriver driver = new FirefoxDriver(profile);

driver.navigate().to("http://myusername:[email protected]/mypath/");


Versionen
Firefox 19.0, 
Selen-Java 2.31.0

Wenn Sie den FireFox-Treiber verwenden ... Sie können ein FireFox-Profil erstellen und den Benutzernamen/den Pass im Kennwort-Manager speichern und ein Add-On für die automatische Anmeldung verwenden. Denken Sie daran, wenn Sie in Selenium einen FireFox- oder Chrome-Treiber erstellen, der standardmäßig ein anonymes Profil verwendet. Daher wird keine Ihrer regulären Erweiterungen/Add-Ons/etc verwendet. Daher ist es am besten, ein Profil zu erstellen, das verteilt und in der Quellcodeverwaltung gespeichert werden kann.

1) In Windows geben Sie im Start/Start-Menü "firefox.exe -p" ein, um den Profil-Manager aufzurufen und einen benutzerdefinierten zu erstellen und ihn an einem Ort mit dem restlichen Code zu speichern.

2) Nicht fragen beim Start wird geprüft

3) Laden Sie das AutoAuth-Add-On herunter https://addons.mozilla.org/en-US/firefox/addon/autoauth/

4) Besuchen Sie die Site, die die HTTP-Basisauthentifizierung erfordert, und speichern Sie die Anmeldeinformationen

Wenn Sie die Website das nächste Mal besuchen, werden Sie von AutoAuth angemeldet, ohne dass die Authentifizierungsaufforderung erscheint.

Wenn Sie über NTLM verfügen, können Sie die Konfigurationseinstellungen ändern, um die Hostnamen aufzunehmen: network.automatic-ntlm-auth.trusted-uris

5
Joey V.

Sie können versuchen, die Header direkt wie folgt zu bearbeiten:

Wenn Sie beginnen, müssen Sie zuerst Selenium ti aktivieren, um Header zu ändern:

Selenium.start("addCustomRequestHeader=true");

Dann müssen Sie einige grundlegende Codierungen und Header-Manipulationen wie folgt verwenden:

    String authHeader = "";
    try {
    BASE64Encoder coder = new BASE64Encoder();
    authHeader = coder.encode("developers:Str492ight".getBytes());
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    setUpSelenium();
    startSelenium();
    Selenium.addCustomRequestHeader("Authorization", "Basic " + authHeader);
    Selenium.open("/");
    Selenium.waitForPageToLoad("10000");

Der Platz nach Basic ist notwendig. So sieht ein einfacher HTTP-Authentifizierungsheader aus.

Außerdem könnten Sie einige HTTP Watchers verwenden, um zu sehen, ob die Anfrage Ihre Authentifizierungsanfrage enthält.

Verwenden Sie entweder Wireshark oder besser Fiddler oder Charles Proxy.

Ich hoffe, das hat geholfen. Gergely.

2
Hannibal

Wie bereits erwähnt, kann die addCustomRequestHeader-Lösung nur im Proxy-Injektionsmodus arbeiten. Als ich versuchte, es zu implementieren, kam ich zu anderen Problemen, die sich auf diesen Proxy-Injektionsmodus beziehen.

Es ist mir nicht klar, ob die Proxy-Injection überhaupt funktioniert, wenn der Java-Client verwendet wird. Bei jedem Aufruf von open () erhielt ich einen seltsamen Fehler: "this.onXhrStateChange.bind ist keine Funktion". Die einzige Lösung, die ich gefunden habe, implizierte, dass Sie einen zusätzlichen Parameter mit dem Wert 'hinzufügen müssen. true für die Methode open (), aber die Java-Client-API akzeptiert nur einen einzelnen Parameter.

Daher musste ich mich mit den oben erläuterten Browser-Konfigurationslösungen zufriedengeben, bei denen ich mich nicht wirklich wohl fühle, da sie von der Bereitschaft des Anbieters abhängen, sie zu unterstützen.

Die Portierung Ihrer Tests auf Selenium 2 (noch immer Alpha) ist möglicherweise eine bessere Perspektive, aber in meinem Fall ist dies erst möglich, wenn Selenium Grid Selenium 2 unterstützt.

Ich hoffe, das kann jedem helfen, Sebastien

0
Sebastien B.

Nun, Sie können das Sikuli-Skript verwenden, um dieses Firefox-Authentifizierungs-Popup in Windows und in einer Linux-Umgebung zu behandeln.

  • Sikuli unter Windows/Linux herunterladen und einrichten (Abhängigkeiten müssen installiert werden) 
  • Verwenden Sie das folgende Sikuli-Skript, um Popups zu behandeln: wobei Authentilcat1.png das Popup-Bild ist und 100 Popups behandelt

for i in range (100): while exists(Pattern("Authentlcatl.png").similar(0.99)): print("Found Authentication Popup") wait(2) type("admin" + Key.TAB) type("admin" + Key.ENTER)

  • Verwenden Sie den folgenden Code, um das Sikuli-Skript aus Java-Code auszulösen und zu beenden:

So lösen Sie das Sikuli-Skript aus :

String[] lincmd = { "bash", "-c", "Sudo Java -jar Sikuli-X/Sikuli-IDE/sikuli-script.jar Sikuli-X/Sikuli-IDE/new1.sikuli/" };

Java.lang.Runtime.getRuntime (). Exec (lincmd);

Um das Sikuli-Skript zu beenden :

String[] lincmd = { "bash", "-c", "Sudo kill $(ps aux | grep '[s]ikuli' | awk '{print $2}')" };

Java.lang.Runtime.getRuntime (). Exec (lincmd);

  • Nach dem Auslösen des Sikuli-Skripts aus Java-Code wird das Sikuli-Skript separat als anderer Prozess ausgeführt, so dass der Java-Code schließlich das Sikuli-Skript beendet.

  • Jedes Mal, wenn das Popup auf dem Bildschirm erscheint, wird das Sikuli-Skript behandelt.

0
Ramkumar

Die Verarbeitung von Firefox 17 'Benutzername: Kennwort' (RFC1738) ist in Firefox standardmäßig nicht zulässig (zuvor war es gelungen). Ich habe jedoch festgestellt, dass es wieder aktiviert werden kann durch:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.negotiate-auth.trusteduris", hostname);
driver = new FirefoxDriver(profile);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
Selenium = new WebDriverBackedSelenium(driver, "http:// + username + ":"
    + password + "@"
    + hostname + ":" + port + baseUrl);

Funktioniert mit Selenium 2.28.0, Firefox 17; Wird für die DigestAuth-Anmeldung verwendet.

0
MitchSundt