Webdriver - HTTP认证对话框

5

我有一个非常简单的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个回答

5
问题在于 这不是一个javascript弹出窗口,因此您无法通过selenium的 alert() 进行操作。
如果既不使用AutoIt,也不使用在URL中提交凭据(最简单的选项 - 只需打开网址并单击“显示图像”),那么另一种方法是使用AutoAuth Firefox插件自动提交先前保存的凭据:

当您选择让浏览器保存登录信息时,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 屏幕识别和自动化工具来提交弹出窗口中的凭据。
还有其他想法和选项:

谢谢alecxe,上面提到的代码片段对我很有效。 - Ripon Al Wasim
以上代码适用于FF。我如何在Chrome和IE中执行相同的操作? - Ripon Al Wasim
@RiponAlWasim 请考虑创建一个关于那个问题的单独提问。谢谢。 - alecxe
顺便提一下,Autoit或类似方法无法与最新的webdriver配合使用。驱动程序卡在OpenQA.Selenium.NoAlertPresentException上。 - l0pan

3
基本/NTLM身份验证弹出窗口是浏览器对话框窗口。WebDriver(Selenium 2.0)无法与此类对话框窗口交互。原因在于WebDriver仅旨在模拟用户与网站的交互,而浏览器对话框窗口目前不在该范围内。JavaScript对话框窗口是网站的一部分,因此WebDriver可以处理这些窗口。在Selenium 1.0中,可以进行基本身份验证。
那么如何解决这个问题呢?1)通过URL进行身份验证http://username:password@website.com;2)使用浏览器插件来处理基本/NTLM身份验证;3)使用本地代理修改请求头并传递用户名/密码;4)利用机器人,如AutoIt或一些Java库。
选项1:最简单,对系统/测试影响最小。选项2:对浏览器的影响很大,因为需要加载插件。而且每个浏览器都使用自己的插件,可能某些浏览器所需的插件不可用。选项3:针对HTTP效果良好,但HTTPS需要自定义证书,因此不总是可行的。对系统和测试的影响不大。选项4:模拟键盘按键,是一个常用的解决方案,但容易出错。仅在对话框窗口具有焦点时才有效,而这并不总是情况。

1
我遇到了同样的问题,并使用机器人类得到了一些具体的解决方案。这是一个解决方法,让我们看看它是否有效。
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()//或者其他带有能力和所需内容的驱动程序
(new Thread(new DialogWindow())).start();
driver.get(url);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接