如何使用Java使用Selenium WebDriver处理Chrome中的身份验证弹出窗口

我正在尝试处理我的一个新的Webdriver脚本中的身份验证弹出窗口。我有一个适用于IE的工作解决方案,但我正在努力解决Chrome问题。IE就像遵循[此页面]上的建议一样简单:如何使用Java使用Selenium WebDriver处理身份验证弹出窗口。该线程并未显示Chrome的出色解决方案,尽管一些评论者指出,该解决方案不适用于Chrome。问题是,当您尝试在Chrome上执行以下代码时,登录弹出窗口不是警报。

 WebDriverWait wait = new WebDriverWait(driver, 10);      
 Alert alert = wait.until(ExpectedConditions.alertIsPresent());     
 alert.authenticateUsing(new UserAndPassword(**username**, **password**));

它不是一个窗口级()身份验证弹出窗口,网页只是受密码保护。我知道在Stack Overflow上还有其他几个这个问题的例子,但我没有看到任何超过2年的例子。我希望在2017年有更好的解决方案。提前致谢。


答案 1

可能有助于其他人在chrome扩展的帮助下在chrome中解决此问题。感谢@SubjectiveReality给了我这个想法。

如果同一服务器同时执行身份验证并托管应用程序,则将用户名和密码作为 url 的一部分(如 https://username:password@www.mytestsite.com)发送可能会有所帮助。但是,大多数企业应用程序都具有公司范围的身份验证,并且应用程序服务器可能会将请求重新路由到身份验证服务器。在这种情况下,在 URL 中传递凭据将不起作用。

解决方案如下:

#Step1:创建镶边扩展程序#

  1. 创建一个名为“扩展名”的文件夹
  2. 在“扩展”文件夹中创建一个名为“manifest.json”的文件。将以下代码复制到文件中并保存。

{ “name”:“Webrequest API”, “version”:“1.0”, “description”:“Extension to handle Authentication window”, “permissions”:[“<all_urls>”,“webRequest”,“webRequestBlocking”], “background”: { “scripts” : [“webrequest.js”] }, “manifest_version”: 2 }

  1. 在“扩展名”文件夹中创建一个名为“webrequest.js”的文件,并将以下代码复制粘贴到文件中并保存。
chrome.webRequest.onAuthRequired.addListener(
function handler(details){
 return {'authCredentials': {username: "yourusername", password: "yourpassword"}};
},
{urls:["<all_urls>"]},
['blocking']);
  1. 打开 chrome 浏览器,转到 chrome://extensions 并打开开发者模式

  2. 单击“包扩展”,选择根目录作为“扩展”和包扩展。它应该创建一个扩展名为“.crx”的文件

#Step2:将扩展添加到测试自动化框架中#

  1. 将.crx文件复制到框架中
  2. 配置您的网络驱动程序创建以加载扩展程序,例如
options.addExtensions(new File("path/to/extension.crx"));
options.addArguments("--no-sandbox");
  1. 调用您的网络驱动程序和应用程序 URL
  2. 您不会看到身份验证弹出窗口显示为由上述扩展名处理的

祝您测试愉快!

引用:

http://www.adambarth.com/experimental/crx/docs/webRequest.html#apiReference https://developer.chrome.com/extensions/webRequest#event-onAuthRequired chrome.webRequest.onAuthRequired Listener https://gist.github.com/florentbr/25246cd9337cebc07e2bbb0b9bf0de46


答案 2

*编辑 Chrome 不再支持此功能。

这不是一个“受限”弹出窗口,可以通过在地址前面加上用户名和密码来处理吗?

而不是去.driver.get("http://www.example.com/");driver.get("http://username:password@www.example.com");


推荐