Webdriver – HTTP身份validation对话框

我有一个非常简单的selenium-webdriver脚本。 我想使用webdriver进行HTTP身份validation。

脚本:

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")) 

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

如果AutoIt和提交URL中的凭据(最简单的选项 – 只是打开url并单击“显示图像”)不适合您,另一种方法可能是使用AutoAuth firefox插件自动提交以前保存的凭据:

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

按照HTTP Basic Auth中的建议通过Firefox中的URL不起作用? 线:

  • 安装AutoAuth Firefox插件;
  • 访问需要身份validation的站点。 输入您的用户名和密码,并确保选择保存凭据;
  • 将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屏幕识别和自动化工具在弹出窗口中提交凭据。


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

  • 支持BASIC和摘要HTTP身份validation
  • 使用Selenium处理浏览器级别身份validation

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

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

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

我面临同样的问题,并使用机器人类获得了一些具体的解决方案 它的解决方法或解决方案,让我们看看,但它的工作原理。

 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 [AZ] (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驱动程序=新的FirefoxDriver()//或任何其他具有function和其他必需内容的驱动程序

 (new Thread(new DialogWindow()))。start();

 driver.get(URL);
Interesting Posts