2010-06-11 15 views
18

So che normalmente è possibile accedere a siti che richiedono l'autenticazione HTTP di base con selenio passando il nome utente e la password nella URL, ad esempio:L'autenticazione di base HTTP tramite URL in Firefox non funziona?

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

Sono stato in esecuzione di un test Selenio con Firefox 2 o 3 e lì ho ancora la finestra di dialogo "Autenticazione richiesta"?

Aggiornamento: Sembra non essere un problema di selenio, ma piuttosto un problema di Firefox. Se inserisco manualmente l'URL all'interno di FF, otterrò la finestra di autenticazione, ma se inserisco l'URL in Opera, la mia pagina viene visualizzata senza mostrare una finestra di autenticazione.

risposta

1

Si potrebbe provare a manipolare le intestazioni direttamente in questo modo:

In primo luogo quando si avvia, è necessario abilitare Selenio ti manipolare le intestazioni:

selenium.start("addCustomRequestHeader=true"); 

allora dovete usare qualche codifica di base e di testa una manipolazione del genere:

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

Lo spazio dopo Base è necessario. Ecco come appare un'intestazione di autenticazione HTTP di base.

Inoltre, è possibile utilizzare alcuni Http Watcher per verificare se la richiesta contiene la richiesta di autorizzazione.

O utilizzare Wireshark, o meglio è Fiddler o Charles Proxy.

Spero che questo abbia aiutato. Gergely.

+0

Ciao Gergely, grazie per il suggerimento. L'ho provato sfortunatamente appare ancora la finestra di autorizzazione. Ho provato a catturare le intestazioni HTTP con Firebug e TamperData. Con entrambi sulla mia richiesta iniziale sull'URL http: // myusername: [email protected]/mypath non vedo alcuna richiesta. Solo dopo aver inserito il nome utente/password nella finestra auth, la richiesta viene inviata e l'intestazione HTTP contiene l'attributo auth di base. – Peter

+0

Dannazione ... Posso solo pensare a ciò che resta guardando nel registro del server stesso se è stato ricevuto o rifiutato ... Mi dispiace non ho più idee :( – Hannibal

+0

Peter , È possibile aggiungere solo intestazioni di richiesta se si utilizza il server Selenium come proxy. Ho scritto un articolo su questo: http://mogotest.com/blog/2010/06/23/how -to-perform-basic-auth-in-selenium Speriamo che questo ti aiuti. – nirvdrum

10

Ho una soluzione per Firefox e Internet Explorer.

Per Firefox, è necessario andare in about: config e creare l'intero network.http.phishy-UserPass lunghezza con una lunghezza di 255. Questo dice a Firefox di non popup una scatola di autenticazione se il nome utente e la password sono meno di 255 caratteri. È ora possibile utilizzare http://user:[email protected] per l'autenticazione.

Per Internet Explorer, è necessario modificare il registro. Nella chiave HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_HTTP_USERNAME_PASSWORD_DISABLE, creare il DWORD Valori iexplore.exe e explorer.exe e assicurarsi che i loro valori sono .

Ho dovuto ignorare anche l'autenticazione NTLM. Per autenticare NTLM utilizzando la sintassi di autenticazione di base HTTP in Firefox, è sufficiente specificare i domini utilizzati nella stringa di configurazione di Firefox network.automatic-ntlm-auth.trusted-uris (che accompagna la prima opzione di configurazione). Questo funzionerà in IE con il solo registy edit.

+0

può anche seguire questo: http://aleetesting.blogspot.com/2011/10/selenium-webdriver-tips.html – MacGyver

+0

Come specificare più di un dominio sulla rete.automatic-ntlm-auth.trusted-uris string? (xxx; xxx;)? – iGallina

+0

Hai bisogno di più upvotes. – rebelliard

0

Come accennato, la soluzione addCustomRequestHeader può funzionare solo con la modalità di iniezione proxy. Ma quando ho provato a implementarlo, ho avuto altri problemi relativi alla modalità di iniezione proxy.

Non mi è chiaro se l'iniezione proxy funziona anche quando si utilizza il client Java. Ogni volta che chiamerei open(), ho un errore strano affermando: "this.onXhrStateChange. L'unica soluzione che ho trovato implicava l'aggiunta di un parametro aggiuntivo con il valore 'true' al metodo open() ma l'API del client Java accetta solo un singolo parametro

Quindi Ho dovuto accontentarmi delle soluzioni di configurazione del browser spiegate sopra che non mi sento a mio agio perché dipendono dalla volontà del fornitore di supportarle

Portare i test al selenio 2 (ancora alfa a partire da ora) potrebbe essere una prospettiva migliore ma nel mio caso non sarà possibile fino a quando Selenium Grid supporta Selenium 2.

Speranza che possa aiutare chiunque, Sebastien

+0

addCustomRequestHeader non richiede la modalità di iniezione proxy. Richiede che il browser utilizzi il server Selenium come proxy. Questa è la differenza tra "* iexploreproxy" e "* piexplore". Ad esempio, se decidi di creare il tuo launcher personale, potresti persino utilizzare il launcher HTA contro il proxy Selenium in IE. Consiglio vivamente di evitare l'iniezione del proxy. – nirvdrum

+0

Grazie nirvdrum. Potrei dare a addCustomRequestHeader un'altra prova allora. In realtà ho avuto l'idea dal tuo blog ma stavo cercando di implementarlo in Java. Essendo relativamente nuovo al selenio, mi sono confuso tra l'iniezione proxy e l'utilizzo del selenio rc come proxy. –

5

Se si utilizza il driver FireFox ... È possibile creare un profilo FireFox e salvare il nome utente/passare in Gestione password e utilizzare un componente aggiuntivo per l'accesso automatico. Ricorda che se crei un driver FireFox o Chrome in Selenium, per impostazione predefinita utilizza un profilo anonimo. Quindi nessuna delle tue estensioni/add-on/etc regolari verrà utilizzata. Quindi è meglio creare un profilo che possa essere distribuito e salvato nel controllo del codice sorgente.

1) In Windows, dal menu di avvio/avvio, digitare "firefox.exe -p" per visualizzare Profile Manager e crearne uno personalizzato e salvarlo in una posizione con il resto del codice.

2) Non chiedere all'avvio è selezionata

3) Scarica AutoAuth add-on https://addons.mozilla.org/en-US/firefox/addon/autoauth/

4) Visita il sito che richiede l'autenticazione di base HTTP e salvare le credenziali

prossima volta visitando il sito, AutoAuth effettuerà l'accesso senza la richiesta di autenticazione richiesta.

Se avete NTLM, è possibile modificare l'impostazione per includere i nomi host della configurazione: network.automatic-NTLM-auth.trusted-URI

11

Contribuire alla Druska's risposta, si può fare la stessa configurazione con Selenio 2 API:

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

Questo approccio è più semplice e non si deve chiedere ogni sviluppatore di cambiare la loro configurazione di Firefox. Ho solo provato con il driver di Firefox.

UPDATE:

Per qualche motivo (forse quelli spiegati a https://stackoverflow.com/a/14348701/256245), la soluzione di cui sopra non funziona con le versioni più recenti di Firefox. Ecco cosa funziona per me ora (testato con Firefox 19.0.2):

  1. Installa AutoAuth plug-in per Firefox;
  2. Visitare il sito in cui è necessaria l'autenticazione.Inserisci il tuo nome utente e password e assicurati di scegliere di salvare le credenziali;
  3. 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";
  4. un'istanza di Firefox WebDriver come segue:

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

Assicurarsi di creare un'istanza del file pluginAutoAuth con il percorso corretto in cui è stato salvato l'installazione del plugin. Se non ti senti a tuo agio con il profilo predefinito, puoi utilizzare Firefox Profile Manager e crearne uno specifico per i tuoi test.

riferimento a questa nuova soluzione: http://watirmelon.com/2012/06/27/automatic-firefox-authentication-when-using-selenium-webdriver-with-autoauth/

0

Firefox 17 'username: password' (RFC1738) il trattamento non è consentito per impostazione predefinita in Firefox (che aveva lavorato in precedenza). Tuttavia, ho trovato che può essere riattivato da:

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

Opere su Selenium 2.28.0, Firefox 17; utilizzato per il login DigestAuth.

7

Aggiungere una barra dopo la root di contesto:

Invece di: selenium.open("http://myusername:[email protected]/mypath");

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

Si fa tutta la differenza del mondo aggiungendo la barra al termine del contesto radice. Senza la barra, il popup si apre, con la barra viene autenticato come previsto.

Nota, che questo non è un bug di selenio o quant'altro, ma una cosa di firefox. È possibile utilizzare la riga di comando anche per vedere di persona:

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

Per me, funziona anche senza impostazioni delle reti URI:

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


versioni
Firefox 19,0,
selenio -java 2.31.0

+2

Vorrei poterti dare più voti per menzionare che lo slash finale è richiesto ... fantastico. Stavo sbattendo la testa contro un muro ... –

+1

Wow. sto lottando dal giorno. Questo è appena risolto il mio problema con uno /. Grazie – bhasker

+0

Aiuta anche me. Incredibile. Sto usando chromedriver. –

0

Bene, puoi farti usare lo script Sikuli per gestire questa autenticazione di Firefox p funziona su Windows e in ambiente Linux.

  • download e installazione di Sikuli in Windows/Linux (è necessario installare le dipendenze)
  • Usare il seguente Sikuli Script per gestire popup: dove Authentilcat1.png è l'immagine popup e gestirà 100 popup

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)

  • Utilizzare il seguente codice per attivare e terminare lo script Sikuli dal codice Java:

per attivare il Sikuli Script:

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

di risolvere lo Script Sikuli:.

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

java.lang.Runtime.getRuntime() exec (lincmd);

  • Dopo l'attivazione dello script Sikuli dal codice Java, lo script Sikuli verrà eseguito come un altro processo a parte, così finalmente nel codice Java che chiude la sceneggiatura Sikuli.

  • Così ogni volta che il popup appare sullo schermo, lo script Sikuli gestirà.

Problemi correlati