Java Webdriver-HTTP身份验证对话框
我有一个非常简单的SeleniumWebDriver脚本。我想使用webdriver进行HTTP身份验证 脚本: 问题: 投掷 org.openqa.selenium.NoAlertPresentException:不存在警报 问题: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
- 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选项类似,您可以使用屏幕识别和自动化工具在弹出窗口中提交凭据
另请参见其他想法和选项:
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);