2013-10-18 49 views
2

我有一個網頁。當我首先打開該網頁時,它會要求進行服務器身份驗證。提供服務器身份驗證後,它允許我瀏覽網站。 我必須自動化該網頁,但由於服務器身份驗證,我無法前進。 我該如何處理在蓋布本服務器身份驗證或Web驅動如何使用Geb/WebDriver處理服務器認證

回答

0

這就是所謂的基本身份驗證。所以,你可以在地址欄通過用戶名和密碼

http://user:[email protected] 

基本身份驗證不webdriver的

支持
0

我不能用這個,因爲我在@我的用戶名(是的,Microsoft帳戶) 。這就是爲什麼我決定採用代理解決方案來攔截我的請求並插入準備好的授權標頭。我想直接在測試中使用代理,因此它是完全自動化的。現在生成的代碼是相當粗糙的,基於Browser.drive而不是藝術蓋布代碼的狀態,但我相信,如果你知道蓋布,你可以很容易地適應它:

import geb.Browser 
import geb.Configuration 
import io.netty.handler.codec.http.DefaultHttpRequest 
import io.netty.handler.codec.http.HttpObject 
import io.netty.handler.codec.http.HttpRequest 
import io.netty.handler.codec.http.HttpResponse 
import org.littleshoot.proxy.HttpFilters 
import org.littleshoot.proxy.HttpFiltersAdapter 
import org.littleshoot.proxy.HttpFiltersSourceAdapter 
import org.littleshoot.proxy.HttpProxyServer 
import org.littleshoot.proxy.impl.DefaultHttpProxyServer 
import org.openqa.selenium.firefox.FirefoxDriver 
import org.openqa.selenium.firefox.FirefoxProfile 

def baseUrl = System.getProperty("baseUrl", "http://localhost/app/") 

// LittleProxy setup 
def proxyPort = 8181 
HttpProxyServer server = DefaultHttpProxyServer.bootstrap() 
    .withPort(proxyPort) 
    .withFiltersSource(
    new HttpFiltersSourceAdapter() { 
     @Override 
     HttpFilters filterRequest(HttpRequest originalRequest) { 
      return new HttpFiltersAdapter(originalRequest) { 
       @Override 
       HttpResponse requestPre(HttpObject httpObject) { 
        if (httpObject instanceof DefaultHttpRequest) { 
         if (httpObject.getUri().startsWith(baseUrl)) { 
          if (httpObject.headers().contains("Authorization")) { 
           println "Already contains the Authorization header: " + httpObject.getUri() 
          } else { 
           println "Adding Authorization header to request: " + httpObject.getUri() 
           httpObject.headers().add("Authorization", "Basic " + System.getProperty("basicAuth")) 
          } 
         } else { 
          println "Ignoring request: " + httpObject.getUri() 
         } 
        } else { 
         println "Ignoring event: " + httpObject 
        } 
        return null 
       } 
      } 
     } 
    }) 
    .start(); 

println "Base URL: " + baseUrl 

FirefoxProfile profile = new FirefoxProfile(); 
profile.setPreference("network.proxy.http", "localhost"); 
profile.setPreference("network.proxy.http_port", proxyPort); 
// to force proxy for localhost or 127.0.0.1 too 
profile.setPreference("network.proxy.no_proxies_on", ""); 
// http://kb.mozillazine.org/Network.proxy.type 
// 1 = manual proxy configuration; default 5 would use system settings 
profile.setPreference("network.proxy.type", 1); 
profile.setPreference("browser.fixup.alternate.enabled", false); 

def configuration = new Configuration() 
def driver = new FirefoxDriver(profile) 
configuration.setDriver(driver) 

Browser.drive(configuration, { 
    go baseUrl 

    def navigator = $("#app-title") 
    assert navigator.getAttribute("title") == "App title" 
}) 

driver.close() 
server.stop() 

首先,它開始代理 - 基於https://github.com/adamfisk/LittleProxy

然後它爲代理設置Firefox配置文件。某些設置與localhost的使用有關,但如果您使用任何其他主機名,則它不會受到傷害。

最後我們開始測試,將配置提供給drive(...)調用。

我還沒有得到更多的經驗與小代理,它是如何穩定等,但對於這種簡單的情況下,它工作得很好。攔截只有baseUrl的請求非常重要,因爲Firefox可能會調用Google搜索實例 - 並且您不希望在那裏發送授權哈希(因爲它很容易反轉)。這也是爲什麼我在JVM參數中提供它:-DbaseUrl=http://localhost/finrisk -DbasicAuth=xxx...allTheWayToEqualSing=

很顯然,它現在適用於Firefox,但我想如果可以設置其代理設置,它應該可以適用於其他瀏覽器。