我正在尝试使用Selenium WebDriver自动使用用户名和密码登录网站。我已经完成了我的研究,我不相信WebDriver支持这个功能,所以我需要找到另一种方法。我正在尝试自动登录的网站位于here。
当提示登录时,出现一个似乎不属于浏览器的弹出窗口。我正在使用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();
答案 0 :(得分:4)
您看到的弹出窗口是由Web服务器提示的,是一个身份验证提示。 Selenium不支持此操作。
处理此限制的一种方法是在网址中传递用户和密码,如下所示:
http://user:password@example.com
此处提供了更多信息:http://aleetesting.blogspot.in/2011/10/selenium-webdriver-tips.html
答案 1 :(得分:2)
我想要我的答案因为我认为我已经解决了。这个答案不需要通过URL传递凭据(对于那些无法喜欢我的人)。它也不需要在解决方案中安装或包含任何自定义Firefox配置文件或扩展,也不需要安装到浏览器上,从而消除了跨机器兼容性问题。
我的问题是,无法通过URL传递凭据来完成身份验证,因为登录位于代理服务器后面。
所以,我转向windows自动化工具包并找到了AutoIT。使用AutoIT和Selenium,您可以通过将用户名和密码发送到出现的Windows对话框来自动登录。方法如下(注意以下步骤适用于c#:
1 - 从http://www.autoitscript.com/site/autoit/downloads/
下载AutoIT2 - 将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));
无论如何,就是这样,它就像一个魅力:)
另请注意,有些特殊字符需要使用序列“{x}”在AutoIT中进行转义。例如,如果您的密码是“!tRocks”,则需要将其作为“{!} tRocks”传递给AutoIT。
快乐自动化。
答案 2 :(得分: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);
hostname是您的URL(example.com),然后尝试
Driver.Navigate().GoToUrl(http://user:password@example.com);
答案 3 :(得分:0)
我刚刚完成了一个原型项目,该项目应该能够处理这种情况。
它利用流行的开源代理BrowserMob来执行身份验证。
SeleniumBasicAuthWrapper希望它有所帮助!它仍在进行中,但希望我们能在不久的将来解决任何问题或缺陷。