Java Webdriver-HTTP身份验证对话框

Java Webdriver-HTTP身份验证对话框,java,selenium,selenium-webdriver,http-authentication,Java,Selenium,Selenium Webdriver,Http Authentication,我有一个非常简单的SeleniumWebDriver脚本。我想使用webdriver进行HTTP身份验证 脚本: 问题: 投掷 org.openqa.selenium.NoAlertPresentException:不存在警报 问题: Webdriver是否只找到一个警报对话框作为警报 在不使用AutoIt或http://username:password@somesite的情况下,我可以选择哪些选项来自动执行此操作 编辑 警报已在下面的方法中出现,并且似乎尚未实现 driver.switc

我有一个非常简单的SeleniumWebDriver脚本。我想使用webdriver进行HTTP身份验证

脚本:

问题:

投掷

org.openqa.selenium.NoAlertPresentException:不存在警报

问题:

  • Webdriver是否只找到一个警报对话框作为警报
  • 在不使用AutoIt或http://username:password@somesite的情况下,我可以选择哪些选项来自动执行此操作
编辑

警报已在下面的方法中出现,并且似乎尚未实现

driver.switchTo().alert().authenticateUsing(new UsernameAndPassword("username","password"))
问题在于,这不是javascript弹出窗口,因此无法通过selenium的
alert()
对其进行操作

如果URL中的AutoIt和提交凭据(最简单的选项-打开并单击“显示图像”)都不是您的选项,则另一种方法可以用于自动提交以前保存的凭据:

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

下面是线程中建议的答案:

  • 安装AutoAuth Firefox插件
  • 访问需要验证的站点。输入用户名和密码,确保选择保存凭据
  • 在硬盘上保存AutoAuth安装文件:在插件页面,右键单击“添加到Firefox”和“另存链接为”
  • 实例化Firefox webdriver,如下所示:

此外,与AutoIt选项类似,您可以使用屏幕识别和自动化工具在弹出窗口中提交凭据


另请参见其他想法和选项:


基本/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:模仿键盘按键,这是一个解决方案,但容易出错。仅当对话框窗口具有焦点时才起作用,可能情况并非总是如此

我也面临同样的问题,并使用robot类得到了一些具体的解决方案。它的变通方法或解决方案,让我们看看,但它是有效的

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);
}

}
公共类DialogWindow实现可运行{
@凌驾
公开募捐{
试一试{
输入凭据();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
public void entercredentials()中断异常{
睡眠(5000);
试一试{
输入文本(“用户名”);
输入SpecialChar(KeyEvent.VK_选项卡);
输入文本(“密码”);
输入SpecialChar(KeyEvent.VK_输入);
}捕获(awtexe){
}
}
私有void enterText(字符串文本)引发AWTException{
机器人=新机器人();
byte[]bytes=text.getBytes();
for(字节b:字节){
int字节码=b;
//keycode仅处理[A-Z](即ASCII十进制[65-90])
if(字节码>96&&字节码<123)
字节码=字节码-32;
机器人延迟(40);
机器人按键(字节码);
机器人按键释放(字节码);
}
}
私有void enterpialchar(int s)引发AWTException{
机器人=新机器人();
机器人延迟(40);
机器人。按键;
机器人。钥匙释放;
}
}
怎么称呼它

WebDriver driver= new FirefoxDriver()// or any other driver with capabilities and other required stuff (new Thread(new DialogWindow())).start(); driver.get(url); WebDriver driver=new FirefoxDriver()//或具有功能和其他所需内容的任何其他驱动程序 (新线程(新对话框窗口()).start(); 获取(url);
谢谢alecxe,上面提到的代码片段对我很有用。上面的代码是针对FF的。如何使用Chrome和IE做同样的事情?@ RiponAlWasim,请考虑创建一个单独的问题。谢谢。顺便说一句,Autoit或类似方法不适用于最后一个webdriver。驱动程序被OpenQA.Selenium.NoAlertPresentException卡住
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);
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);