5

Ho un sito Web in cui la maggior parte delle pagine viene normalmente utilizzata tramite HTTP ma alcune altre pagine sono disponibili solo tramite HTTPS. Il sito è protetto dall'autenticazione di base (le credenziali sono le stesse per le pagine HTTP e HTTPS).Come passare attraverso la finestra per chiedere le credenziali di autenticazione di base che appare quando il collegamento clicca reindirizzamento da HTTP a HTTPS?

Quando apro qualsiasi pagina HTTP nel browser (FF o Chrome) e faccio clic sul collegamento che conduce alla pagina HTTPS, il browser mostra un avviso che richiede le credenziali di autenticazione di base.

Ho lo stesso problema con il WebDriver (sia FF o Chrome):
Quando visito http://username:[email protected]_domain.com e fare clic su link che porta alla pagina HTTPS, il browser finestra di avviso che chiede le credenziali auth di base appare. Il selenio non "ricorda" le credenziali immesse per la pagina HTTP.

Come posso seguire questa sequenza di azioni con Webdriver? Se non è possibile cosa puoi consigliare?

+0

ho finito per usare AutoAuth come mostrato [qui] (http://watirmelon.com/2012/06/27/automatic-firefox-authentication-when-using-selenium-webdriver-with-autoauth/) in Firefox. Ma non so come risolvere questo problema con Chrome. –

+0

È possibile utilizzare [autoit] (http://stackoverflow.com/questions/14621212/autoit-code-for-handling-windows-authentication-pop-up-using-selenium-webdriver) e gestire la finestra di autenticazione durante l'utilizzo di qualsiasi tipo di browser. – Hemanth

+0

Attualmente utilizzo il proxy Browsermob per questo. –

risposta

3
FirefoxProfile profile = new FirefoxProfile(); 
profile.SetPreference("network.http.phishy-userpass-length", 255); 
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris", hostname); 
Driver = new FirefoxDriver(profile); 

hostname è l'URL (example.com) quindi provare a

Driver.Navigate().GoToUrl(http://user:[email protected]); 
+0

L'ho già provato. Non risolve il problema –

+1

puoi provare a creare un profilo che è già stato autenticato, quindi passare ad esso (https://code.google.com/p/selenium/wiki/TipsAndTricks) –

+1

@AndrianDurlestean Questo sembra essere un un suggerimento diverso, quindi dovresti postarlo come una tua risposta separata. –

1

La soluzione migliore che ho potuto venire con finora è creare un nuovo thread che gestisce un timeout. Poiché WebDriver non restituisce il controllo su FF e altri browser, posso chiamare il gestore thread che utilizza Robot per inserire le credenziali e premere invio (potrebbe anche utilizzare AutoIt qui). Quindi il controllo viene restituito a WebDriver per continuare con lo script.

//put this where it belongs, say calling a new url, or clicking a link 
//assuming necessary imports 

int pageLoadTimeout = 10; 
String basicAuthUser = "user"; 
String basicAuthPass = "pass"; 
String url = "https://yourdomain.com"; 

WebDriver driver = new FirefoxDriver(); 

TimeoutThread timeoutThread = new TimeoutThread(pageLoadTimeout); 
timeoutThread.start(); 

driver.get(url); 

//if we return from driver.get() call and timeout actually occured, wait for hanlder to complete 
if (timeoutThread.timeoutOccurred){ 
    while (!timeoutThread.completed) 
     Thread.sleep(200); 
} 
else { 
    //else cancel the timeout thread 
    timeoutThread.interrupt(); 
} 


public class TimeoutThread extends Thread { 

    int timeout; 
    boolean timeoutOccurred; 
    boolean completed; 

    public TimeoutThread(int seconds) { 
     this.timeout = seconds; 
     this.completed = false; 
     this.timeoutOccurred = false; 
    } 

    public void run() { 
     try { 

      Thread.sleep(timeout * 1000); 
      this.timeoutOccurred = true; 
      this.handleTimeout(); 
      this.completed = true; 

     } 
     catch (InterruptedException e) { 
      return; 
     } 
     catch (Exception e){ 
      System.out.println("Exception on TimeoutThread.run(): "+e.getMessage()); 
     } 
    } 

    public void handleTimeout(){ 

     System.out.println("Typing in user/pass for basic auth prompt"); 

     try { 
      Robot robot = new Robot(); 

      //type is defined elsewhere - not illustrating for this example 
      type(basicAuthUser); 
      Thread.sleep(500); 

      robot.keyPress(KeyEvent.VK_TAB); 
      robot.keyRelease(KeyEvent.VK_TAB); 
      Thread.sleep(500); 

      type(basicAuthPass); 
      Thread.sleep(500); 

      robot.keyPress(KeyEvent.VK_ENTER); 
      robot.keyRelease(KeyEvent.VK_ENTER); 
     } 
     catch (AWTException e) { 
      System.out.println("Failed to type keys: "+e.getMessage()); 
     } 
    } 
}