2012-08-06 67 views
1

我试图使用Selenium WebDriver自动使用用户名和密码登录到站点。我已经完成了我的研究,并且我不相信WebDriver支持该功能,所以我需要找到另一种方法。我试图自动登录的网站位于here使用网络驱动程序和弹出窗口的http授权

当提示登录时出现一个弹出窗口,它似乎不属于浏览器的一部分。我使用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(); 
+0

就像更新一样,我能够解决这个问题。以前我尝试过sendkeys,但无法让它正常工作。我正在使用Sendkeys.sendWait(),在发送密钥之前使函数等待,但它仍然没有效果。通过在Sendkeys.sendWait(“text to put”)之前放入Thread.sleep(2000),它可以很好地工作。不知道为什么需要thread.sleep语句,因为sendwait应该覆盖,但它需要什么 – John 2012-08-09 17:27:59

+0

另外我也尝试过WebDriverWait()函数,但它没有帮助 – John 2012-08-09 17:36:15

回答

2

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

一个来处理这个限制的办法是在URL中传递用户名和密码像象下面这样:

http://user:[email protected]

更多信息请访问:http://aleetesting.blogspot.in/2011/10/selenium-webdriver-tips.html

+0

嗨Satish,谢谢你的回应。我查看了您提供的链接,但无法使其工作。我以前尝试在URL中传递用户和密码。它没有工作,只是自动转发到同一主页:portal.adp.com。我的用户名格式为:[email protected],用户名中有'@'符号。以下是我尝试不成功的网址: – John 2012-08-08 20:27:19

+0

http:// :[email protected]/ http:// user%40mycompany:[email protected]/ https:// user% 40mycompany:[email protected]/ https:// user%40mycompany:[email protected]/login/有什么想法?我也尝试过使用Windows函数sendkeys而没有成功。 – John 2012-08-08 20:36:34

+0

你指向主页,这就是为什么你认证后得到主页。 HTML视图源中的登录页面是:'/ wps/employee/employee.jsp'。所以你必须使用:'https:// user:password @ portal.adp.com/wps/employee/employee.jsp' – 2012-08-09 07:56:12

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:[email protected]); 
2

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

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

所以,我转向Windows自动化工具包,并发现AutoIT。使用AutoIT和Selenium,您可以通过将用户名和密码发送到出现的窗口对话框来自动登录。这里是下面的步骤如何(注意是C#:

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

2下载的AutoIt - AutoIt的.dll文件添加到您的项目引用

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

3 - 使用了AutoIt和硒这样的(假设你的网络驱动程序已经初始化):

//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。

快乐自动化。

+0

这正是我正在寻找的。但我有问题。设置Driver.Url实际上并不浏览到该页面。它只是保持空白页面。但是当我使用navigate()。tourl时,它会转到页面,但从不执行下一行代码。 – longlostbro 2015-09-02 20:38:36

0

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

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

SeleniumBasicAuthWrapper希望它有帮助!这项工作仍在进行中,但希望在不久的将来我们会解决任何扭曲或缺陷。