我有一个非常简单的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:没有警报
问题:
修改
警报采用以下方法,但似乎尚未实施。
driver.switchTo().alert().authenticateUsing(new UsernameAndPassword("username","password"))
答案 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);