2015-01-10 32 views
5

我有一个非常简单的selenium-webdriver脚本。我想使用webdriver进行HTTP身份验证。Webdriver - HTTP身份验证对话框

脚本:

WebDriver driver = new FirefoxDriver(); 
driver.get("http://www.httpwatch.com/httpgallery/authentication/"); 
driver.findElement(By.id("displayImage")).click(); 
Thread.sleep(2000); 
driver.switchTo().alert().sendKeys("httpwatch"); 

问题:

driver.switchTo().alert().sendKeys("httpwatch"); 

抛出

org.openqa.selenium.NoAlertPresentException:没有警报存在

问题:

  • Webdriver是否仅查找警报对话框作为警报?
  • 我的选择是不使用的AutoIt或HTTP自动完成://用户名:密码@somesite

编辑

警报已下面的方法似乎并没有已经没有实现。

driver.switchTo().alert().authenticateUsing(new UsernameAndPassword("username","password")) 

回答

5

的问题是,这不是一个JavaScript弹出因此你无法通过硒的alert()操纵它。

如果AutoIt和在URL中提交凭据(最简单的选项 - 只需打开the url并单击“显示图像”)不是您的选择,另一种方法可能是使用AutoAuth firefox addon自动提交以前保存的凭据:

当您选择让 选择让浏览器保存您的登录信息时,AutoAuth会自动提交HTTP验证对话框。 (如果你有 已经告诉浏览器你的用户名和密码是什么,并且 你已经告诉它记住用户名和密码,为什么不只是 已经自动提交它而不是每次询问你?)

继答案建议在HTTP Basic Auth via URL in Firefox does not work?螺纹:

  • 安装AutoAuth Firefox插件;
  • 访问需要身份验证的站点。输入您的用户名和密码,并确保选择保存凭据;
  • 将AutoAuth安装文件保存在硬盘上:在插件页面,右键单击“添加到Firefox”和“保存链接为”;
  • 实例化的Firefox的webdriver如下:
FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default"); 
File pluginAutoAuth = new File("src/test/resources/autoauth-2.1-fx+fn.xpi"); 
firefoxProfile.addExtension(pluginAutoAuth); 
driver = new FirefoxDriver(firefoxProfile); 

此外,在类似的AutoIt选项的方式 - 你可以使用sikuli屏幕识别和自动化工具,在弹出提交的凭据。


也看其他的想法和选择:

+0

感谢alecxe,上面提到的代码片段工作对我来说很好。 –

+0

以上代码适用于FF。我如何使用Chrome和IE来做同样的事情? –

+0

@RiponAlWasim请考虑创建一个单独的问题。谢谢。 – alecxe

3

基本/ NTLM身份验证弹出窗口是浏览器的对话窗口。 WebDriver(Selenium 2.0)不能与这种对话窗口进行交互。这是因为WebDriver的目标仅仅是模仿用户与网站的交互,而浏览器对话窗口目前不在该范围内。 JavaScript对话框窗口是网站的一部分,所以WebDriver可以处理这些窗口。在Selenium 1.0中,可以执行基本身份验证。

那么如何解决这个问题呢? 1)通过URL验证http://username:[email protected] 2)使用浏览器插件来处理基本/ NTLM身份验证3)使用本地代理来修改请求头并传递用户名/密码4)使用机器人,如AutoIt ,或者一些Java库。

选项1:对系统/测试来说是最简单并且影响最小的。选项2:作为加载插件,浏览器影响很大。同样,每个浏览器都使用自己的插件,并且可能某些浏览器所需的插件不可用。选项3:适用于HTTP,但HTTPS需要自定义证书,因此并不总是一个选项。对系统和测试没有太大的影响。选项4:模仿键盘按键,它是一种解决方案,但容易出错。只有当对话窗口有焦点时才可以使用,并且可能情况并非总是如此。

0

我面临同样的问题,并得到了一些使用机器人类的具体解决方案。其解决方法或解决方案,让我们看看,但它的作品。

public class DialogWindow implements Runnable { 

@Override 
public void run() { 
    try { 
     entercredentials(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public void entercredentials() InterruptedException { 
    Thread.sleep(5000); 
    try { 
     enterText("username"); 
     enterSpecialChar(KeyEvent.VK_TAB); 
     enterText("password"); 
     enterSpecialChar(KeyEvent.VK_ENTER); 

    } catch (AWTException e) { 

    } 
} 

private void enterText(String text) throws AWTException { 
    Robot robot = new Robot(); 
    byte[] bytes = text.getBytes(); 

    for (byte b : bytes) { 
     int bytecode = b; 
     // keycode only handles [A-Z] (which is ASCII decimal [65-90]) 
     if (bytecode> 96 && bytecode< 123) 
      bytecode = bytecode - 32; 
     robot.delay(40); 
     robot.keyPress(bytecode); 
     robot.keyRelease(bytecode); 
    } 
} 

private void enterSpecialChar(int s) throws AWTException { 
    Robot robot = new Robot(); 
    robot.delay(40); 
    robot.keyPress(s); 
    robot.keyRelease(s); 
} 

} 

如何称呼它

WebDriver driver= new FirefoxDriver()// or any other driver with capabilities and other required stuff 

(new Thread(new DialogWindow())).start(); 

driver.get(url);