2010-06-11 34 views
18

我知道,通常您可以登錄到通過將用戶名和密碼的網址需要與硒HTTP基本身份驗證的網站,如:通過Firefox中的URL進行HTTP基本身份驗證不起作用?

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

我一直在運行Selenium測試與Firefox 2或3那裏我仍然得到「需要認證」對話窗口?

更新:它似乎不是一個硒問題,而是一個Firefox問題。如果我在FF中手動輸入網址,我會得到驗證對話框,但是如果我在Opera中輸入網址,我的網頁將顯示而不顯示驗證對話框。

回答

1

您可以嘗試直接操縱頭是這樣的:

首先,當你開始,你必須啓用硒TI操縱頭:

selenium.start("addCustomRequestHeader=true"); 

那麼你必須使用一些基本的編碼和報頭這樣的操作:

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

Basic之後的空間是必要的。這是一個基本的HTTP身份驗證標題。

此外,您可以使用一些Http Watcher來查看請求是否包含您的身份驗證請求。

要麼使用Wireshark,要麼更好的是Fiddler或Charles Proxy。

希望有幫助。 Gergely。

+0

嗨Gergely,謝謝你的提示。我已經嘗試過,不幸的是授權窗口仍然彈出。我試圖用Firebug和TamperData捕獲HTTP頭。對於我在URL http:// myusername:[email protected]/mypath上的初始請求,我都沒有看到任何請求。只有在auth窗口中輸入用戶名/密碼後,纔會發送請求並且HTTP標頭包含基本身份驗證屬性。 – Peter 2010-06-11 09:32:20

+0

該死的......我只能想到剩下的東西是否正在查看服務器的日誌,如果它被收到或拒絕了,它就會自動登錄... 對不起,我沒有任何想法:( – Hannibal 2010-06-11 10:15:09

+0

Peter , 如果您使用Selenium服務器作爲代理服務器,您只能添加請求標頭。我已經寫了一篇關於此的文章: http://mogotest.com/blog/2010/06/23/how -to-執行-基本認證 - 在硒 希望這可以幫助你 – nirvdrum 2010-06-25 17:28:52

10

我有一個Firefox和Internet Explorer的解決方案。

對於Firefox,你需要進入about:config中和創建整數network.http.phishy,爲userpass長度與255的長度這就告訴火狐如果用戶名不彈出驗證框和密碼少於255個字符。您現在可以使用http://user:[email protected]進行身份驗證。

對於Internet Explorer,您必須編輯註冊表。在關鍵HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Internet Explorer \ MAIN \ FeatureControl \ FEATURE_HTTP_USERNAME_PASSWORD_DISABLE,創建DWORD值IEXPLORE.EXEExplorer.exe的,並確保它們的值。我不得不重寫NTLM身份驗證。要使用Firefox中的HTTP基本身份驗證語法進行NTLM身份驗證,只需指定在Firefox配置字符串network.automatic-ntlm-auth.trusted-uris(隨第一個配置選項一起使用)中使用的域。這將在單獨註冊編輯的IE中起作用。

+0

也可以按照此:http://aleetesting.blogspot.com/2011/10/selenium-webdriver-tips.html – MacGyver 2012-03-22 15:19:33

+0

如何在network.automatic-ntlm-auth.trusted-uris字符串中指定多個域?(xxx; xxx;)? – iGallina 2015-01-15 17:04:20

+0

你需要更多的讚揚。 – rebelliard 2015-05-19 18:34:59

0

如前所述,addCustomRequestHeader解決方案只能用於代理注入模式。但是當我試圖實現它時,我遇到了與該代理注入模式相關的其他問題。

在使用Java客戶端時,我還不清楚代理注入是否可以工作。任何時候我會打開(),我有一個奇怪的錯誤,說:「this.onXhrStateChange。綁定不是函數「 我發現的唯一解決方案意味着您需要爲open()方法添加一個額外的參數,其值爲'true',但Java客戶端API只接受單個參數

所以我不得不滿足上面解釋的瀏覽器配置解決方案,因爲它們取決於供應商是否願意支持它們,所以我不太滿意。

將您的測試移植到Selenium 2(仍然是現在的alpha)可能是更好的前景,但在我的情況下,它是不可能的,直到Selenium Grid支持Selenium 2。

希望可以幫助任何人, Sebastien

+0

addCustomRequestHeader不需要代理注入模式。它要求瀏覽器使用Selenium服務器作爲代理。這是「* iexploreproxy」和「* piexplore」之間的區別。例如,如果您決定創建自己的啓動器,則甚至可以在IE中使用HTA啓動器來對付Selenium代理。 我強烈建議您避免代理注入。 – nirvdrum 2010-08-12 12:09:22

+0

謝謝nirvdrum。然後我可以再嘗試addCustomRequestHeader。 其實我從你的博客中得到了這個想法,但我試圖用Java來實現它。作爲Selenium相對較新的代碼,我在代理注入和使用硒代理之間感到困惑。 – 2010-08-12 15:43:12

5

如果您使用的是火狐驅動程序...您可以創建一個Firefox配置文件,並保存用戶名/密碼的密碼管理器和使用附加到自動登錄。請記住,如果您在Selenium中創建FireFox或Chrome驅動程序,默認情況下它會使用匿名配置文件。因此,您的常規擴展/插件/ etc都不會被使用。所以最好不要創建一個可以在源代碼管理中分發和保存的配置文件。

1)在Windows中,從運行/開始菜單鍵入「firefox.exe -p」,彈出配置文件管理器,並創建一個自定義的,它與你的代碼的其餘部分保存在一個位置。

2)在啓動時不要問檢查

3)下載AutoAuth附加https://addons.mozilla.org/en-US/firefox/addon/autoauth/

4)訪問需要HTTP基本身份驗證的網站,並保存憑據

下一次您訪問該網站時,AutoAuth將在未顯示驗證所需提示的情況下登錄您。

如果你有NTLM,你可以修改配置設置,包括主機名:network.automatic-NTLM身份auth.trusted-URI的

11

特約Druska's的回答,您可以用做同樣的配置Selenium 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); 

這種方法更簡單,您不必要求每個開發人員更改其Firefox配置。我只用Firefox驅動程序進行測試。

UPDATE

出於某種原因(也許是那些在https://stackoverflow.com/a/14348701/256245解釋),上述解決方案不與Firefox的更新版本。這裏是我現在的作品(用Firefox 19.0.2測試):

  1. 安裝AutoAuth Firefox插件;
  2. 訪問在需要認證的網站。輸入您的用戶名和密碼,並確保選擇保存憑據;
  3. 將AutoAuth安裝文件保存在硬盤上:在插件頁面,右鍵單擊「添加到Firefox」和「保存鏈接爲」;
  4. 實例化的Firefox的webdriver如下:

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

確保與您保存插件安裝正確的路徑來實例化pluginAutoAuth文件。如果您對使用默認配置文件感到不舒服,則可以使用Firefox配置文件管理器並創建一個特定於您的測試的配置文件。

參考這個新的解決方案:http://watirmelon.com/2012/06/27/automatic-firefox-authentication-when-using-selenium-webdriver-with-autoauth/

0

火狐17 '用戶名:密碼'(RFC1738)處理是通過在Firefox默認值(它早先幹過)不允許。然而,我發現,它可以被重新啓用:

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

硒2.28.0作品,火狐17;用於DigestAuth登錄。

7

添加斜線的上下文根之後:

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

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

它使整個世界的範圍內的末尾添加斜線所有的差異根。如果沒有斜槓,彈出窗口會打開,斜線會按照預期進行驗證。

請注意,這這不是一個硒缺陷或什麼都不是,而是一個Firefox的東西。您可以使用命令行,以及看到自己:

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

對於我來說,它的工作原理,即使沒有設置網絡的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/"); 


版本的Firefox 19.0,
硒-java 2.31.0

+2

希望我可以給你更多upvotes提到的結局斜線是必需的...驚人的。我的頭撞在牆上... – 2016-02-12 12:12:06

+1

哇。我從一天開始掙扎。這只是解決了我的問題與一個/。謝謝 – bhasker 2016-11-16 08:48:48

+0

也幫助我。難以置信的。我正在使用chromedriver。 – 2017-01-03 10:33:01

0

那麼,你可以讓你使用Sikuli腳本來處理這個Firefox認證p在Windows以及Linux環境中都可以使用opup。

  • 下載並安裝Sikuli在Windows/Linux操作系統(需安裝依賴)
  • 使用以下Sikuli腳本來處理彈出:其中Authentilcat1。PNG是彈出圖像,它會處理100個彈窗

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)

  • 使用下面的代碼來觸發並終止從Java代碼Sikuli腳本:

瞭解觸發Sikuli腳本

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

終止Sikuli腳本

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

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

  • 觸發從Java代碼的Sikuli腳本後,Sikuli腳本將分別在Java代碼終止Sikuli腳本運行作爲另一個過程,所以最後。

  • 所以每當彈出窗口出現在屏幕上,Sikuli腳本就會處理。

相關問題