1

我正在尝试使用Selenium WebDriver使用用户名和密码自动登录到站点。我已经完成了我的研究,我不相信 WebDriver 支持这个功能,所以我需要找到另一种方法。我尝试自动登录的站点位于此处

当提示登录时,会出现一个似乎不是浏览器一部分的弹出窗口。我正在使用 Firefox 和 Chrome。似乎可能需要 Windows API?我已经尝试在 URL 中传递凭据,但这不起作用。还尝试了 sendkeys,但收到了应用程序不接受 Windows 消息的 Windows 异常。我也尝试切换当前handle使用driver.windowhandles,但弹出窗口似乎不是新句柄。

有人有什么想法吗?我有点卡住了。进入弹出窗口的初步代码是:

IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://www.portal.adp.com");
string currentWindow = driver.CurrentWindowHandle;
IWebElement userLogin = driver.FindElement(By.Id("employee"));
userLogin.Click();
4

4 回答 4

4

您看到的弹出窗口由 Web 服务器提示,是一个身份验证提示。Selenium 不支持此操作。

处理此限制的一种方法是在 url 中传递用户和密码,如下所示:

http://user:password@example.com

更多信息在这里:http ://aleetesting.blogspot.in/2011/10/selenium-webdriver-tips.html

于 2012-08-07T05:35:38.637 回答
2

我想要我的答案,因为我想我已经解决了。此答案不需要通过 URL 传递凭据(对于那些无法喜欢我的人)。它也不需要安装或包含在解决方案中或安装到浏览器上的任何自定义 Firefox 配置文件或扩展,从而消除了跨机器兼容性问题。

我的问题是无法通过通过 URL 传递凭据来完成身份验证,因为登录位于代理后面。

所以,我转向 Windows 自动化工具包并找到了 AutoIT。使用 AutoIT 和 Selenium,您可以通过将用户名和密码发送到出现的 Windows 对话框来自动登录。方法如下(注意以下步骤适用于 c#:

1 - 从http://www.autoitscript.com/site/autoit/downloads/下载 AutoIT

2 - 将 autoit .dll 添加到您的项目引用中。

右键单击引用,选择添加引用。接下来单击浏览按钮并浏览到 dll 位置(大多数默认安装将是 c:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.dll),然后添加到项目中。

3 - 像这样使用 AutoIT 和 Selenium(假设您的 Web 驱动程序已经初始化):

    //Initialize AutoIT
    var AutoIT = new AutoItX3();

    //Set Selenium page load timeout to 2 seconds so it doesn't wait forever
    Driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(2));

    //Ingore the error
    try
    {
      Driver.Url = url;
    }
    catch
    {
      return;
    }

    //Wait for the authentication window to appear, then send username and password
    AutoIT.WinWait("Authentication Required");
    AutoIT.WinActivate("Authentication Required");
    AutoIT.Send("username");
    AutoIT.Send("{TAB}");
    AutoIt.Send("password");
    AutoIT.Send("{ENTER}");

    //Return Selenium page timeout to infinity again
    Driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(-1));

无论如何,就是这样,它就像一个魅力:)

另请注意,有些特殊字符需要在 AutoIT 中使用序列“{x}”进行转义。例如,如果您的密码是“!tRocks”,则需要将其作为“{!}tRocks”传递给 AutoIT。

快乐的自动化。

于 2014-02-28T20:00:02.350 回答
0
   FirefoxProfile profile = new FirefoxProfile();
   profile.SetPreference("network.http.phishy-userpass-length", 255);
   profile.SetPreference("network.automatic-ntlm-auth.trusted-uris", hostname);
   Driver = new FirefoxDriver(profile);

主机名是您的 URL (example.com) 然后尝试

Driver.Navigate().GoToUrl(http://user:password@example.com);
于 2013-06-03T14:25:17.613 回答
0

我刚刚完成了一个原型项目的工作,该项目应该能够准确处理这种情况。

它利用流行的开源代理 BrowserMob 来执行身份验证。

SeleniumBasicAuthWrapper 希望对您有所帮助!它仍在进行中,但希望我们能在不久的将来解决任何问题或缺陷。

于 2014-05-17T02:00:18.933 回答