Firefox中的HTTP Basic Auth通过URL不起作用?

时间:2010-06-11 09:15:00

标签: testing selenium basic-authentication functional-testing

我知道通常您可以通过在URL中传递用户名和密码来登录需要使用Selenium进行HTTP基本身份验证的站点,例如:

selenium.open("http://myusername:myuserpassword@mydomain.com/mypath");

我一直在使用Firefox 2或3进行Selenium测试,在那里我仍然可以获得“需要身份验证”对话框窗口?

更新:似乎不是Selenium问题,而是Firefox问题。如果我在FF中手动输入URL,我将获得身份验证对话框,但如果我在Opera中输入URL,则会显示我的页面而不显示身份验证对话框。

8 个答案:

答案 0 :(得分:11)

有助于Druska的回答,您可以使用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驱动程序。

<强>更新

出于某种原因(可能是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);
    
  5. 确保使用保存插件安装的正确路径实例化pluginAutoAuth文件。如果您对使用默认配置文件感到不舒服,可以使用Firefox配置文件管理器并创建一个特定于测试的配置文件。

    参考这个新解决方案:http://watirmelon.com/2012/06/27/automatic-firefox-authentication-when-using-selenium-webdriver-with-autoauth/

答案 1 :(得分:10)

我有Firefox和Internet Explorer的解决方案。

对于Firefox,您需要进入 about:config 并创建长度为255的整数 network.http.phishy-userpass-length 。这告诉Firefox如果用户名和密码少于255个字符,则不要弹出认证框。您现在可以使用http://user:pass@domain.com进行身份验证。

对于Internet Explorer,您必须编辑注册表。在密钥 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_HTTP_USERNAME_PASSWORD_DISABLE 中,创建DWORD值 iexplore.exe explorer.exe 并确保其值 0

我还必须覆盖NTLM身份验证。要使用Firefox中的HTTP基本身份验证语法对NTLM进行身份验证,只需指定Firefox配置字符串 network.automatic-ntlm-auth.trusted-uris 中使用的域(随附第一个配置选项)。这将在IE中与单独的注册编辑一起使用。

答案 2 :(得分:7)

在上下文根之后添加斜杠:

而不是: selenium.open("http://myusername:myuserpassword@mydomain.com/mypath");

使用: selenium.open("http://myusername:myuserpassword@mydomain.com/mypath/");

它使世界的所有区别在于在上下文根的末尾添加斜杠。如果没有斜杠,弹出窗口会打开,斜杠会按预期进行身份验证。

注意,这不是硒虫或诸如此类的东西,而是一个firefox的东西。您也可以使用命令行自己查看:

 C:\Program Files\Mozilla Firefox>firefox http://myusername:myuserpassword@mydomain.com/mypath/

对我而言,即使没有设置网络uris,它也能正常工作:

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:myuserpassword@mydomain.com/mypath/");


版本
Firefox 19.0,
selenium-java 2.31.0

答案 3 :(得分:5)

如果您使用的是FireFox驱动程序...您可以创建FireFox配置文件并将用户名/密码保存在密码管理器中,并使用加载项自动登录。请记住,如果您在Selenium中创建FireFox或Chrome驱动程序,默认情况下它使用匿名配置文件。因此,不会使用任何常规扩展/附加组件等。因此,最好创建一个可以在源代码管理中分发和保存的配置文件。

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-uris

答案 4 :(得分:2)

您可以尝试直接操纵标题:

首先,当你开始时,你必须启用Selenium 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");

基本之后的空间是必要的。这是基本的HTTP身份验证标头的样子。

您还可以使用一些Http Watchers查看请求是否包含您的身份验证请求。

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

希望有所帮助。 盖尔盖伊。

答案 5 :(得分:0)

如前所述,addCustomRequestHeader解决方案只能用于代理注入模式。但是当我尝试实现它时,我遇到了与代理注入模式相关的其他问题。

我不清楚在使用Java客户端时代理注入是否完全起作用。无论何时我打电话给open(),我都会得到一个奇怪的错误:“this.onXhrStateChange.bind不是函数”。 我发现的唯一解决方案暗示您需要向open()方法添加值为'true'的额外参数,但Java客户端API仅接受单个参数。

所以我不得不满足于上面解释的浏览器配置解决方案,因为它们取决于供应商是否愿意支持它们,所以我并不感到满意。

将测试移植到Selenium 2(现在仍然是alpha)可能是一个更好的前景,但在我的情况下,直到Selenium Grid支持Selenium 2才能实现。

希望可以帮助任何人, 的Sebastien

答案 6 :(得分:0)

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

适用于Selenium 2.28.0,Firefox 17;用于DigestAuth登录。

答案 7 :(得分:0)

那么,您可以使用Sikuli脚本在Windows和Linux环境中处理此Firefox身份验证弹出窗口。

  • 在Windows / Linux中下载并设置Sikuli(需要安装依赖项)
  • 使用以下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脚本就会处理。