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

时间:2017-02-08 13:49:54

标签: java google-chrome selenium authentication selenium-webdriver

我正在尝试在我的一个新的Webdriver脚本中处理身份验证弹出窗口。我有一个适用于IE的工作解决方案,但我正在努力使用Chrome。 IE就像遵循[本页]上的建议一样简单:How to handle authentication popup with Selenium WebDriver using Java。该线程并没有为Chrome提供一个很好的解决方案,尽管有几位评论员指出,该解决方案不适用于Chrome。问题是,当您尝试在Chrome上执行以下代码时,登录弹出窗口不是警报。

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

这不是Windows级别()身份验证弹出窗口,网页只是受密码保护。我知道Stack Overflow上有这个问题的其他几个例子,但我最近没有看到比2岁更多的例子。我希望2017年有更好的解决方案。提前致谢。

5 个答案:

答案 0 :(得分:2)

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

不是"限制"弹出窗口可以通过用用户名和密码预先填写地址来处理吗?

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

答案 1 :(得分:1)

借助chrome扩展程序,可能对其他人在chrome中解决此问题可能有所帮助。感谢@SubjectiveReality,他给了我这个主意。

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

这是解决方案:

步骤1:创建镶边扩展程序

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

{       “ name”:“ Webrequest API”,       “ version”:“ 1.0”,       “ description”:“扩展以处理认证窗口”,       “ permissions”:[“”,“ webRequest”,“ webRequestBlocking”],       “背景”: {        “脚本”:[“ 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”的文件

第二步:将扩展添加到您的测试自动化框架中

  1. 将.crx文件复制到您的框架中
  2. 配置您的Webdriver创建以加载扩展程序,例如
options.addExtensions(new File("path/to/extension.crx"));
options.addArguments("--no-sandbox");
  1. 调用您的Webdriver和应用程序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 :(得分:1)

@Bhuvanesh Mani提供的解决方案的更新答案

manifest.json


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

webrequest.js


    chrome.webRequest.onAuthRequired.addListener(function(details){
        console.log("chrome.webRequest.onAuthRequired event has fired");
        return {
                authCredentials: {username: "yourusername", password: "yourpassword"}
            };
    },
    {urls:["<all_urls>"]},
    ['blocking']);

不确定为什么需要'--no sandbox'选项,但对我来说不是必需的。

我确实需要执行注册表编辑以允许添加扩展名,因为这已通过公司AD策略禁用:

  • 以管理员身份打开regedit.exe
  • 导航到 电脑\ HKEY_USERS \
  • 将现在设置为*的REG_SZ值更改为-
  • 重新启动要在其中添加扩展程序的chrome实例。

与原始答案的唯一区别是在权限中也需要显示网址。

额外的
如果要查看控制台输出,请打开开发人员模式,然后在Chrome的扩展程序屏幕中为扩展程序点击Inspect views background page

答案 3 :(得分:0)

我知道您的情况是Java,但这可能会有所帮助。我可以使用C#中的这种方法来克服警报:

// I am using a static instance of the driver for this.
Driver.Instance.Navigate().GoToUrl(url);
var alert = Driver.Instance.SwitchTo().Alert();
alert.SendKeys($"{Driver.user_name}" + Keys.Tab + $"{Driver.user_password}" + Keys.Tab);
alert.Accept();
Driver.Instance.SwitchTo().DefaultContent();

然后我使用一个测试用户帐户作为user_name和password的值。

答案 4 :(得分:0)

Selenium 4 支持使用 Basic 和 Digest auth 进行身份验证。它使用 CDP,目前仅支持 Chrome 衍生浏览器

Java 示例:

Webdriver driver = new ChromeDriver();

((HasAuthentication) driver).register(UsernameAndPassword.of("username", "pass"));

driver.get("http://sitewithauth");

注意:在 Alpha-7 中存在错误,它发送用户名/密码的用户名。需要等待 selenium 版本的下一个版本,因为主干 https://github.com/SeleniumHQ/selenium/commit/4917444886ba16a033a81a2a9676c9267c472894

中有修复可用
相关问题