【问题标题】:http authorization with webdriver and popup window使用 webdriver 和弹出窗口进行 http 授权
【发布时间】:2012-08-06 23:42:20
【问题描述】:

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

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

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

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

【问题讨论】:

  • 作为一个更新,我能够解决这个问题。以前我尝试过 sendkeys 但无法使其正常工作。我正在使用 Sendkeys.sendWait(),让函数在发送密钥之前等待,但它仍然没有效果。通过将 Thread.sleep(2000) 放在 Sendkeys.sendWait("text to put") 之前,它可以完美运行。不确定为什么需要 thread.sleep 语句,因为 sendwait 应该涵盖这一点,但它是需要的
  • 另外我也试过WebDriverWait()函数,但也没有用

标签: c# selenium-webdriver


【解决方案1】:

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

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

http://user:password@example.com

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

【讨论】:

  • 嗨 Satish,感谢您的回复。我查看了您提供的链接,但无法使其正常工作。我之前尝试在 url 中传递用户和密码。它没有用,只是自动将我转发到同一个主页:portal.adp.com。我的用户名格式为:user@mycompany.com,用户名中带有“@”符号。这是我尝试但没有成功的网址:
  • http://:password@portal.adp.com/ user%40mycompany:password@portal.adp.com user%40mycompany:password@portal.adp.com user%40mycompany:password@portal.adp.com/login 有什么想法吗?我也尝试使用 Windows 功能 sendkeys 没有成功。
  • 您指向主页,这就是您在身份验证后获得主页的原因。 html 视图源中的登录页面为:/wps/employee/employee.jsp。所以你必须使用:https://user:password@portal.adp.com/wps/employee/employee.jsp
  • 嗨萨蒂什,非常感谢!我还有一个问题——你是如何找到 html 视图中的登录页面的?我只是好奇,所以我可以在将来弄清楚。非常感谢您的帮助!
  • 正如我提到的:您可以在“html 视图源”中看到页面链接。查看主页中的按钮标签属性。
【解决方案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。

快乐的自动化。

【讨论】:

  • 这正是我想要的。但我有一个问题。设置 Driver.Url 实际上并不浏览到页面。它只是一个空白页。但是当我使用 navigate().tourl 时,它会转到页面但从不执行下一行代码。
【解决方案3】:
   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);

hostname 是您的 URL (example.com) 然后尝试

Driver.Navigate().GoToUrl(http://user:password@example.com);

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      相关资源
      最近更新 更多