Webdriver - HTTP身份验证对话框

时间:2015-01-10 16:05:55

标签: java selenium selenium-webdriver http-authentication

我有一个非常简单的selenium-webdriver脚本。我想使用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:// username:password @somesite
  • ,我可以选择自动执行此操作

修改

警报采用以下方法,但似乎尚未实施。

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

3 个答案:

答案 0 :(得分:5)

问题是这不是一个javascript弹出窗口因此你无法通过selenium的alert()来操纵它。

如果自动提交和提交网址中的凭据(最简单的选项 - 只需打开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屏幕识别和自动化工具在弹出窗口中提交凭据。


另见其他想法和选项:

答案 1 :(得分:3)

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

那么如何解决这个问题呢? 1)通过URL http://username:password@website.com进行身份验证2)使用将处理Basic / NTLM身份验证的浏览器插件3)使用将修改请求标头并传递用户名/密码的本地代理4)使用机器人,如AutoIt,或某些Java库。

选项1:最简单,对系统/测试的影响最小。选项2:您的加载插件具有很高的浏览器影响力。此外,每个浏览器都使用自己的插件,并且某些浏览器所需的插件可能无法使用。选项3:适用于HTTP,但HTTPS需要自定义证书,因此并不总是一个选项。对系统和测试都没有太大影响。选项4:模仿键盘按键,它是一个解决方案,但容易出错。仅在对话框窗口具有焦点时才有效,并且可能并非总是如此。

答案 2 :(得分: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);