我正在使用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测试站点吗?

一个建议是使用代理,但是我不相信这种简单的功能不存在。

有什么建议吗?

评论

您是在测试身份验证还是在安全登录后测试功能?

@NielsvanReijmersdal我正在尝试自行测试站点。我已经测试过,并且当我使用http:// user:pass @ host作为主机时,它实际上可以工作。

#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。