【问题标题】:HTTP Basic Auth via URL in Firefox does not work?在 Firefox 中通过 URL 的 HTTP 基本身份验证不起作用?
【发布时间】:2011-03-02 14:02:58
【问题描述】:

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

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

我一直在使用 Firefox 2 或 3 运行 Selenium 测试,但仍然出现“需要身份验证”对话框窗口?

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

【问题讨论】:

    标签: testing selenium basic-authentication functional-testing


    【解决方案1】:

    为 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火狐插件;
    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);
      

    确保使用保存插件安装的正确路径实例化 pluginAutoAuth 文件。如果您不喜欢使用默认配置文件,您可以使用 Firefox 配置文件管理器并为您的测试创建一个特定的配置文件。

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

    【讨论】:

      【解决方案2】:

      我有一个适用于 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.exeexplorer.exe并确保它们的值为 0

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

      【讨论】:

      【解决方案3】:

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

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

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

      在上下文根的末尾添加斜线会使世界变得与众不同。没有斜线,弹出窗口会打开,斜线会按预期进行身份验证。

      请注意,这不是 selenium bug 之类的,而是 firefox 的东西。您也可以使用命令行来亲自查看:

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

      对我来说,即使没有设置网络 uri,它也可以工作:

      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/");
      


      版本
      火狐 19.0,
      selenium-java 2.31.0

      【讨论】:

      • 希望我能给你更多的赞成票,因为我提到了结尾斜线是必需的……太棒了。把我的头撞在墙上......
      • 哇。我从一天开始就在挣扎。这只是用一个 / 解决了我的问题。谢谢
      • 对我也有帮助。逆天。我正在使用 chromedriver。
      • @DavidSpence 你可以奖励赏金,这是一种“给予更多支持”;)
      【解决方案4】:

      如果您使用的是 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

      【讨论】:

        【解决方案5】:

        您可以尝试像这样直接操作标题:

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

        Basic 后面的空格是必须的。这就是基本的 HTTP 身份验证标头的样子..

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

        要么使用 Wireshark,要么使用 Fiddler 或 Charles Proxy。

        希望对您有所帮助。 格格利。

        【讨论】:

        • 您好 Gergely,感谢您的提示。不幸的是,我已经尝试过授权窗口仍然弹出。我尝试使用 Firebug 和 TamperData 捕获 HTTP 标头。在我对 URL myusername:myuserpassword@mydomain.com/mypath 的初始请求中,我没有看到任何请求。只有在身份验证窗口中输入用户名/密码后,才会发送请求,并且 HTTP 标头包含基本身份验证属性。
        • 该死...我只能想到剩下的就是查看服务器的日志,如果它被接收或拒绝...对不起,我没有任何想法左:(
        • Peter,如果您使用 Selenium 服务器作为代理,您只能添加请求标头。我已经写了一篇关于这个的文章:mogotest.com/blog/2010/06/23/…希望对你有所帮助。
        【解决方案6】:

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

        我不清楚代理注入在使用 Java 客户端时是否有效。每当我调用 open() 时,我都会收到一个奇怪的错误:“this.onXhrStateChange.bind 不是函数”。 我发现的唯一解决方案暗示您需要向 open() 方法添加一个值为“true”的额外参数,但 Java 客户端 API 只接受一个参数。

        所以我不得不接受上面解释的浏览器配置解决方案,因为它们取决于供应商是否愿意支持它们,所以我真的不太适应。

        将您的测试移植到 Selenium 2(目前仍为 alpha 版)可能是一个更好的前景,但在我的情况下,在 Selenium Grid 支持 Selenium 2 之前这是不可能的。

        希望可以帮助到任何人, 塞巴斯蒂安

        【讨论】:

        • addCustomRequestHeader 不需要代理注入模式。它要求浏览器使用 Selenium 服务器作为代理。这就是“*iexploreproxy”和“*piexplore”之间的区别。例如,如果您决定创建自己的启动器,您甚至可以针对 IE 中的 Selenium 代理使用 HTA 启动器。我强烈建议您避免代理注入。
        • 感谢 nirvdrum。我可能会再试一次 addCustomRequestHeader 。实际上我从你的博客中得到了这个想法,但我试图用 Java 来实现它。作为 Selenium 的新手,我在代理注入和使用 selenium rc 作为代理之间感到困惑。
        【解决方案7】:

        Firefox 17 'username:password' (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 登录。

        【讨论】:

          【解决方案8】:

          好吧,你可以让你在 Windows 和 Linux 环境中使用 Sikuli 脚本来处理这个 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 脚本就会处理。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-22
            • 2014-12-31
            • 2012-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-13
            • 1970-01-01
            相关资源
            最近更新 更多