18

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

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

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

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

4

8 回答 8

11

Contributing to Druska´s answer, you can do the same configuration using 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);

This approach is simpler and you do not have to ask every developer to change their Firefox configuration. I only tested with the Firefox driver.

UPDATE:

For some reason (maybe the ones explained at https://stackoverflow.com/a/14348701/256245), the above solution does not work with newer versions of Firefox. Here is what works for me now (tested with Firefox 19.0.2):

  1. Install AutoAuth Firefox plugin;
  2. Visit the site where the authentication is needed. Enter your username and password and make sure to choose to save the credentials;
  3. Save AutoAuth installation file at your hard drive: at the plugin page, right click at “Add to Firefox” and “Save link as”;
  4. Instantiate Firefox webdriver as following:

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

Make sure to instantiate the pluginAutoAuth File with the correct path where you saved the plugin installation. If you do not feel comfortable using the default profile, you can use Firefox Profile Manager and create one specific to your tests.

Reference to this new solution: http://watirmelon.com/2012/06/27/automatic-firefox-authentication-when-using-selenium-webdriver-with-autoauth/

于 2012-03-09T19:09:21.200 回答
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.exeexplorer.exe并确保它们的值为0

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

于 2010-07-29T20:25:56.747 回答
7

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

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


版本
Firefox 19.0、
selenium-java 2.31.0

于 2013-03-04T15:05:29.567 回答
5

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

1) 在 Windows 中,从运行/开始菜单中键入“firefox.exe -p”以调出配置文件管理器并创建一个自定义管理器并将其与其余代码一起保存在某个位置。

2) Don't ask at startup 勾选

3) 下载 AutoAuth 插件https://addons.mozilla.org/en-US/firefox/addon/autoauth/

4) 访问需要 HTTP 基本身份验证的站点并保存凭据

下次您访问该站点时,AutoAuth 将登录您,而不会出现需要身份验证的提示。

如果您有 NTLM,您可以修改配置设置以包含主机名:network.automatic-ntlm-auth.trusted-uris

于 2011-11-14T13:02:34.397 回答
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");

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

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

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

希望有帮助。格格利。

于 2010-06-11T09:23:19.050 回答
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 脚本就会处理。

于 2014-03-25T08:14:39.330 回答
0

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

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

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

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

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

于 2010-08-11T16:15:28.540 回答
0

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 登录。

于 2013-01-15T23:15:10.187 回答