2015-01-10 2 views
5

Ich habe ein sehr einfaches Selen-Webdriver-Skript. Ich möchte HTTP-Authentifizierung mit Webdriver durchführen.Webdriver - HTTP-Authentifizierungsdialog

Script:

WebDriver driver = new FirefoxDriver(); 
driver.get("http://www.httpwatch.com/httpgallery/authentication/"); 
driver.findElement(By.id("displayImage")).click(); 
Thread.sleep(2000); 
driver.switchTo().alert().sendKeys("httpwatch"); 

Ausgabe:

driver.switchTo().alert().sendKeys("httpwatch"); 

wirft

org.openqa.selenium.NoAlertPresentException: Kein Alarm vorhanden ist

Frage:

  • Ist nur eine Warnmeldung als Alarm WebDriver finden?
  • Was ohne meine Möglichkeiten zu automatisieren diese sind mit AutoIt oder http: // username: password @somesite

EDIT

Alarm hat unter Methode und scheint noch nicht umgesetzt worden zu sein.

driver.switchTo().alert().authenticateUsing(new UsernameAndPassword("username","password")) 

Antwort

5

Das Problem ist, dass dies kein Javascript Popup ist daher können Sie es nicht alert() über Selen ist manipulieren.

Wenn sowohl AutoIt als auch Anmeldeinformationen in der URL (die einfachste Option - the url öffnen und klicken Sie auf "Bild anzeigen") sind keine Optionen für Sie, könnte ein anderer Ansatz AutoAuth firefox addon verwenden, um die zuvor gespeicherten Anmeldeinformationen automatisch zu übermitteln:

AutoAuth sendet automatisch HTTP-Authentifizierungsdialoge, wenn Sie ausgewählt haben, damit der Browser Ihre Anmeldeinformationen speichert. (Wenn Sie haben dem Browser bereits mitgeteilt, was Ihr Benutzername und Passwort sind, und Sie haben es gesagt, um diesen Benutzernamen und Passwort zu erinnern, warum nicht nur haben es automatisch einreichen, anstatt Sie jedes Mal zu fragen?)

die Antwort Nach in HTTP Basic Auth via URL in Firefox does not work? Thread vorgeschlagen:

  • AutoAuth Firefox-Plugin installieren;
  • Besuchen Sie die Site, auf der die Authentifizierung erforderlich ist.Geben Sie Ihren Benutzernamen und Ihr Passwort ein und vergewissern Sie sich, dass Sie die Anmeldedaten speichern.
  • Speichern Sie die AutoAuth-Installationsdatei auf Ihrer Festplatte: Klicken Sie auf der Plugin-Seite mit der rechten Maustaste auf "Add to Firefox" und "Link speichern unter";
  • Instantiate Firefox WebDriver, wie folgend:
FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default"); 
File pluginAutoAuth = new File("src/test/resources/autoauth-2.1-fx+fn.xpi"); 
firefoxProfile.addExtension(pluginAutoAuth); 
driver = new FirefoxDriver(firefoxProfile); 

Auch in ähnlicher Weise wie AutoIt Option - Sie sikuli Anzeigenerkennung und Automatisierungs-Tool senden Sie die Anmeldeinformationen im Popup verwenden können.


Siehe auch andere Ideen und Optionen:

+0

Dank alecxe, erwähnt das Code-Snippet funktioniert oben für mich gut. –

+0

Der obige Code ist für FF. Wie kann ich mit Chrome und IE dasselbe tun? –

+0

@RiponAlWasim Bitte denken Sie daran, eine separate Frage dazu zu erstellen. Vielen Dank. – alecxe

3

Die Basic/NTLM-Authentifizierung Pop-up ist ein Browser-Dialogfenster. WebDriver (Selenium 2.0) kann mit solchen Dialogfenstern nicht interagieren. Der Grund dafür ist, dass WebDriver nur darauf abzielt, Benutzerinteraktionen mit Websites zu imitieren, und Browserdialogfenster sind derzeit nicht in diesem Bereich. JavaScript-Dialogfenster sind Teil der Website, daher kann WebDriver damit umgehen. In Selen 1.0 ist es möglich, grundlegende Authentifizierung durchzuführen.

So, wie um dieses Problem zu lösen? 1) Authentifizierung über URL http://username:[email protected] 2) Verwenden Sie ein Browser-Plugin, das die Authentifizierung von Basic/NTLM behandelt 3) Verwenden Sie einen lokalen Proxy, der den Anfrage-Header ändert und den Benutzernamen/Passwort weitergibt und 4) einen Roboter wie AutoIt verwendet oder einige Java Bibliothek.

Option 1: ist am einfachsten und hat den geringsten Einfluss auf das System/Test. Option 2: hat einen hohen Browser-Effekt als Ihre Lade-Plugins. Auch jeder Browser verwendet ein eigenes Plugin und es ist möglich, dass das benötigte Plugin für einen bestimmten Browser nicht verfügbar ist. Option 3: Funktioniert gut mit HTTP, aber HTTPS erfordert benutzerdefinierte Zertifikate daher nicht immer eine Option. Nicht viel Einfluss auf System und Test. Option 4: Imitiert Tastaturanschläge, es ist eine Lösung, aber anfällig für Fehler. Funktioniert nur, wenn das Dialogfenster den Fokus hat und es ist möglich, dass dies nicht immer der Fall ist.

0

Ich sah das gleiche Problem, und bekam eine konkrete Lösung mit Roboterklasse. Seine Abhilfe oder Lösung, lassen Sie sehen, aber es funktioniert.

public class DialogWindow implements Runnable { 

@Override 
public void run() { 
    try { 
     entercredentials(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public void entercredentials() InterruptedException { 
    Thread.sleep(5000); 
    try { 
     enterText("username"); 
     enterSpecialChar(KeyEvent.VK_TAB); 
     enterText("password"); 
     enterSpecialChar(KeyEvent.VK_ENTER); 

    } catch (AWTException e) { 

    } 
} 

private void enterText(String text) throws AWTException { 
    Robot robot = new Robot(); 
    byte[] bytes = text.getBytes(); 

    for (byte b : bytes) { 
     int bytecode = b; 
     // keycode only handles [A-Z] (which is ASCII decimal [65-90]) 
     if (bytecode> 96 && bytecode< 123) 
      bytecode = bytecode - 32; 
     robot.delay(40); 
     robot.keyPress(bytecode); 
     robot.keyRelease(bytecode); 
    } 
} 

private void enterSpecialChar(int s) throws AWTException { 
    Robot robot = new Robot(); 
    robot.delay(40); 
    robot.keyPress(s); 
    robot.keyRelease(s); 
} 

} 

Wie es nennen

WebDriver driver= new FirefoxDriver()// or any other driver with capabilities and other required stuff 

(new Thread(new DialogWindow())).start(); 

driver.get(url);