我有一个网页。当我首先打开该网页时,它要求进行服务器身份验证。提供服务器身份验证后,它允许我浏览网站。我必须自动化该网页,但由于服务器身份验证,我无法继续前进。如何在 Geb 或 Web 驱动程序中处理此服务器身份验证
3 回答
尝试使用这个:
http://username:password@site.com/page
代替 :
http://site.com/page
我无法使用它,因为我的用户名中有@(是的,Microsoft 帐户)。这就是为什么我决定使用代理解决方案来拦截我的请求并插入准备好的授权标头。而且我想在测试中直接使用代理,所以它是完全自动化的。现在生成的代码相当粗糙,基于Browser.drive
而不是任何最先进的 Geb 代码,但我相信如果你了解 Geb,你可以轻松地适应它:
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,但我想它应该可以适用于其他浏览器,如果您可以设置它们的代理设置。
这称为基本身份验证。所以你可以在地址栏中传递用户名和密码
http://user:password@example.com
WebDriver 不支持基本身份验证