2015-01-10 15 views
5

Ho uno script per selenio-web-selettore molto semplice. Mi piacerebbe fare l'autenticazione HTTP usando il webdriver.Webdriver - Finestra di autenticazione HTTP

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"); 

Problema:

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

tiri

org.openqa.selenium.NoAlertPresentException: Nessun avviso è presente

Domanda:

  • Il webdriver trova solo una finestra di avviso come avviso?
  • Quali sono le opzioni per automatizzare questo senza usare AutoIt o http: // username: password @somesite

EDIT

Alert ha seguito il metodo e non sembra essere stata ancora attuata.

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

risposta

5

Il problema è che questo non è un popup javascript quindi non si può manipolare tramite il selenio di alert().

Se entrambi AutoIt e le credenziali che presentano l'URL (l'opzione più semplice - basta aprire the url e fare clic su "Visualizza immagine") non sono opzioni per voi, un altro approccio potrebbe essere quello di utilizzare AutoAuth firefox addon per inviare automaticamente le credenziali salvate in precedenza:

AutoAuth invia automaticamente le finestre di dialogo di autenticazione HTTP quando hai scelto per consentire al browser di salvare le informazioni di accesso. (Se hai già detto al tuo browser quale username e password sono, e hai detto di ricordare quel nome utente e password, perché non solo lo lo invia automaticamente invece di chiederlo ogni volta?)

in seguito alla risposta suggerita in HTTP Basic Auth via URL in Firefox does not work? discussione:

  • Installare AutoAuth plugin per Firefox;
  • Visitare il sito in cui è necessaria l'autenticazione.Inserisci il tuo nome utente e password e assicurati di scegliere di salvare le credenziali;
  • Salvare il file di installazione AutoAuth sul disco rigido: nella pagina del plug-in, fare clic con il pulsante destro su "Aggiungi a Firefox" e "Salva collegamento con nome";
  • un'istanza di Firefox WebDriver quanto segue:
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); 

Inoltre, in modo simile opzione AutoIt a - è possibile utilizzare sikuli riconoscimento dello schermo e strumento automazione di presentare le credenziali nel popup.


vedere anche altre idee ed opzioni:

+0

Grazie alecxe, frammento di codice di cui sopra funziona per me pure. –

+0

Il codice sopra riportato è per FF. Come posso fare la stessa cosa usando Chrome e IE? –

+0

@RiponAlWasim si prega di prendere in considerazione la creazione di una domanda a parte. Grazie. – alecxe

3

L'autenticazione/NTLM comparsa di base è una finestra di dialogo del browser. WebDriver (Selenium 2.0) non può interagire con tali finestre di dialogo. La ragione di ciò è dovuta al fatto che WebDriver mira unicamente a imitare l'interazione dell'utente con i siti Web e le finestre di dialogo del browser non sono attualmente in tale ambito. Le finestre di dialogo JavaScript, fanno parte del sito Web, quindi WebDriver può gestirle. In Selenium 1.0 è possibile eseguire l'autenticazione di base.

Quindi, come risolvere questo problema? 1) Autenticazione tramite URL http://username:[email protected] 2) Utilizzare un plug-in del browser che gestirà l'autenticazione di base/NTLM 3) Utilizzare un proxy locale che modificherà l'intestazione della richiesta e passerà il nome utente/password e 4) Utilizzare un robot, come AutoIt o una libreria Java.

Opzione 1: è il più semplice e ha il minimo impatto sul sistema/test. Opzione 2: ha un impatto elevato sul browser come plug-in di caricamento. Inoltre, ogni browser utilizza il proprio plugin ed è possibile che il plug-in richiesto per un determinato browser non sia disponibile. Opzione 3: funziona bene con HTTP, ma HTTPS richiede certicati personalizzati quindi non sempre un'opzione. Non ha molto impatto su entrambi i sistemi e test. Opzione 4: imita le pressioni della tastiera, è una soluzione ma soggetta a errori. Funziona solo quando la finestra di dialogo è attiva ed è possibile che questo non sia sempre il caso.

0

Ho affrontato lo stesso problema e ho ottenuto una soluzione concreta utilizzando la classe del robot. La soluzione o soluzione, lascia vedere, ma funziona.

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); 
} 

} 

Come chiamare lo

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

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

driver.get(url); 
Problemi correlati