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

Tra*_*ham 11 java authentication selenium google-chrome selenium-webdriver

我正在尝试在我的一个新的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**));
Run Code Online (Sandbox Code Playgroud)

它不是一个windows level()认证弹出窗口,网页只是受密码保护.我知道Stack Overflow上有这个问题的其他几个例子,但我最近没有看到比2岁更多.我希望2017年有更好的解决方案.提前感谢.

Grz*_*icz 8

*edit Chrome 不再支持此功能。

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

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

  • Chrome 不再支持此功能。https://www.chromestatus.com/feature/5669008342777856 答案已过时。 (12认同)
  • @Vaibhav_Sharma 这在 Chrome 中仍然有效。但我们需要仔细观察 Web 应用程序如何进行身份验证。例如,应用程序 url 可能是 https://app.url,但是点击该 url 后,它会重定向到 https://auth.server.url。因此,如果您将用户名和密码附加到 app.url 中,它将无法工作。它应该附加到 auth.server.url。希望这可以帮助。 (2认同)

Bhu*_*ani 6

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

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

解决方法如下:

步骤1:建立Chrome扩充功能

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

{“ name”:“ Webrequest API”,“ version”:“ 1.0”,“ description”:“扩展以处理身份验证窗口”,“ permissions”:[“”,“ webRequest”,“ webRequestBlocking”],“背景” :{“脚本”:[“ webrequest.js”]},“清单版本”:2}

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

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

步骤2:在您的测试自动化框架中添加扩展

  1. 将.crx文件复制到您的框架中
  2. 配置您的Webdriver创建以加载扩展,例如
options.addExtensions(new File("path/to/extension.crx"));
options.addArguments("--no-sandbox");
Run Code Online (Sandbox Code Playgroud)
  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侦听器 https:// gist。 github.com/florentbr/25246cd9337cebc07e2bbb0b9bf0de46

  • 使用少量更新,需要检查以下URL /sf/ask/1162907791/和/sf/ask/3413019711/ -扩展名,因为几乎没有任何更改,并且当前代码不起作用 (2认同)

obi*_*ban 5

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

清单文件


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

Run Code Online (Sandbox Code Playgroud)

网页请求.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']);

Run Code Online (Sandbox Code Playgroud)

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

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

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

与原始答案的唯一区别是 url 也需要出现在权限中。

额外的
,如果你想看到控制台输出,打开开发人员模式,然后单击Inspect views background page在扩展您的扩展屏幕的Chrome