5

Ich habe eine Website, wo die meisten Seiten normalerweise über HTTP verwendet werden, einige andere Seiten jedoch nur über HTTPS. Die Site ist durch Basic Auth geschützt (Anmeldeinformationen sind für HTTP- und HTTPS-Seiten identisch).Wie durchläuft das Fenster die grundlegenden Authentifizierungsinformationen, die angezeigt werden, wenn der Link von HTTP zu HTTPS weitergeleitet wird?

Wenn ich eine HTTP-Seite im Browser (entweder FF oder Chrome) öffne und auf den Link klicke, der zur HTTPS-Seite führt, zeigt der Browser eine Warnung an, die nach grundlegenden Authentifizierungsdaten fragt.

Ich habe gleiches Problem mit WebDriver (entweder FF oder Chrome):
Wenn ich http://username:[email protected]_domain.com besuchen und Link klicken, der auf HTTPS-Seite führt, Browser-Warnfenster, das erscheint für grundlegende auth Anmeldeinformationen gefragt. Selenium erinnert sich nicht an die Anmeldeinformationen, die für die HTTP-Seite eingegeben wurden.

Wie kann ich diese Abfolge von Aktionen mit Webdriver verfolgen? Wenn es nicht möglich ist, was kannst du raten?

+0

landete ich mit AutoAuth oben wie gezeigt [hier] (http://watirmelon.com/2012/06/27/automatic-firefox-authentication-when-using-selenium-webdriver-with-autoauth/) in Firefox. Aber ich weiß nicht, wie ich dieses Problem mit Chrome lösen kann. –

+0

Sie können [autoit] (http://stackoverflow.com/questions/14621212/autoit-code-for-handling-windows-authentication-pop-up-using-selenium-webdriver) verwenden und das Authentifizierungsfenster verwenden, während Sie eines verwenden Art von Browser. – Hemanth

+0

Momentan benutze ich Browsermob Proxy dafür. –

Antwort

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 ist Ihre URL (example.com) versuchen dann zu

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

Ich habe das schon probiert. Es löst nicht das Problem –

+1

Sie können versuchen, ein Profil zu erstellen, das bereits authentifiziert wurde dann wechseln Sie zu es (https://code.google.com/p/selenium/wiki/TipsAndTricks) –

+1

@AndrianDurlestean Dies scheint zu sein anderen Vorschlag, so sollten Sie es wirklich als Ihre eigene separate Antwort veröffentlichen. –

1

Die beste Lösung, die ich habe in der Lage gewesen, mit so weit kommen wird, einen neuen Thread zu erstellen, die ein Timeout behandelt. Da WebDriver die Kontrolle über FF und andere bestimmte Browser nicht zurückgibt, kann ich den Thread-Handler aufrufen, der dann Robot benutzt, um die Zugangsdaten einzugeben und Enter zu drücken (könnte hier auch AutoIt verwenden). Dann wird das Steuerelement an WebDriver zurückgegeben, um mit dem Skript fortzufahren.

//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()); 
     } 
    } 
} 
Verwandte Themen