webdriver.Firefox
,并尝试通过以下方式发送以下自定义标头:self.headers = { 'Authorization': 'Basic %s' % b64encode(bytes(self.args.user + ':' + self.args.password, "utf-8")).decode("ascii") }
:
self.driver.get(self.base_url + "/", headers=self.headers)
,与此处显示的方式类似,但是我猜它使用的是完全不同的驱动程序。
但是我遇到了错误: br />
我已经检查了旧问题#2047:如何向请求中添加标头?但由于另一个“无法解决”问题的重复而被关闭。
是否存在有什么简单的方法可以使用基本身份验证背后的Selenium测试站点吗?
一个建议是使用代理,但是我不相信这种简单的功能不存在。
有什么建议吗?
#1 楼
我已经使用http://user:pass@host
格式进行了测试,并且可以使用。因此在Python(
setUp() of MyClass(unittest.TestCase)
类中)中,它看起来应该像这样:self.base_url = "http://user:pass@host"
基于code.google上#34的Java,以下代码也应正常工作:
或:
public void login(String username, String password){
WebDriver driver = getDriver();
String URL = "http:// + username + ":" + password + "@" + "link";
driver.get(URL);
driver.manage().window().maximize();
}
或:
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.http.phishy-userpass-length", 255);
driver = new FirefoxDriver(profile);
driver.get(http://username:password@www.basicauthprotected.com/);
或最终通过使用
SendKeys()
发送密钥: FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.http.phishy-userpass-length", 255);
profile.setPreference("network.automatic-ntlm-auth.trusted-uris", "<host>");
driver = new FirefoxDriver();
selenium = new WebDriverBackedSelenium(driver, "http://<user>:<password>@<host>");
或使用Alert API。
另请参阅:FirefoxDriver,ChromeDriver和IEdriver的基本身份验证?
对于Chrome,请按照以下步骤操作:如何在selenium2 chrome驱动程序中覆盖基本身份验证?
但是上述每个功能都有一些缺点,因此该功能需要更便携,并且有一些计划可以做到这一点(请参阅:GitHub上的#453)。
评论
我尝试了self.driver.addCustomRequestHeader和self.driver.add_custom_request_header,但都不能在Selenium 2.0(Webdriver)上使用。此方法仅在不再受支持的Selenium RC上可用吗? github.com/SeleniumHQ/selenium-google-code-issue-archive/issues/…
–愤世嫉俗
17年8月15日在17:25
URL中的格式user:pass现在已弃用,因此不应使用。
–弗兰克·H。
18年4月13日在6:54
#2 楼
我还要补充一点:如果您的应用程序正在发出AJAX请求,则该解决方案将无法直接使用。将显示HTTP身份验证提示。为了绕开可以从测试用例执行的操作,请直接触发URL,稍后应用程序将针对该URL发送Ajax请求。这将创建HTTP授权标头,该标头将在所有后续请求(包括Ajax请求)中携带,并且不会显示身份验证提示,从而使测试用例能够顺利执行。
#3 楼
我对FirefoxDriver所做的就是这种方法(仅用于基本url,不用于对其他可能需要基本身份验证的站点的进一步请求):配置Firefox不询问/警告有关使用基本身份验证登录的信息
通过URL传递用户名和密码:
http://user:pass@host.tld
请参阅此处或我的拉取请求。
评论
网址中的格式user:pass现在已弃用,因此不应使用
–弗兰克·H。
18年4月13日在6:55
是的,不幸的是它不再起作用了,并且目前没有其他方法可以实现它。
–Paul Wellner Bou
18年4月14日在8:25
#4 楼
这是一个可以在最新版本的Google Chrome浏览器中使用最新硒版本的解决方案。它会生成一个很小的chrome扩展名(约30行代码),为您添加标头。我创建了一个Java构建器类来轻松生成扩展。使用方法如下:// Add basic auth header with a chrome extension on every request
File authExtension = new SeleniumChromeAuthExtensionBuilder()
.withBasicAuth("Ali Baba", "Open sesame")
.withBaseUrl("https://example.org/*")
.build();
try {
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions = chromeOptions.addExtensions(authExtension);
webDriver = new ChromeDriver(chromeOptions);
} finally {
authExtension.delete();
}
就这些了。然后Chrome将在https://example.org的每个子URL上使用基本身份验证。
您可以在此处获取构建器类:https://gist.github.com/gellweiler/ab0ecb67afb8063a1d276c116bfb26e2。
评论
您是在测试身份验证还是在安全登录后测试功能?@NielsvanReijmersdal我正在尝试自行测试站点。我已经测试过,并且当我使用http:// user:pass @ host作为主机时,它实际上可以工作。