【问题标题】:How to handle authentication popup in Chrome with Selenium WebDriver using Java如何使用 Java 使用 Selenium WebDriver 在 Chrome 中处理身份验证弹出窗口
【发布时间】:2017-06-26 04:16:42
【问题描述】:

我正在尝试在我的一个新 Webdriver 脚本中处理身份验证弹出窗口。我有一个适用于 IE 的工作解决方案,但我在 Chrome 上苦苦挣扎。 IE 就像遵循 [this page]: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 level () 身份验证弹窗,网页只是受密码保护。我知道在 Stack Overflow 上还有其他几个这个问题的实例,但我最近没有看到超过 2 岁。我希望 2017 年现在有更好的解决方案。提前致谢。

【问题讨论】:

  • 可以分享一下网站吗?
  • 我很乐意,但过去 2 年我们在这里遇到了几个安全问题,我知道我的经理会担心我分享链接。这是一个面向公众的开发网站,这就是他们对其进行密码保护的原因。
  • 你看过这个吗? seleniumwebdrivertrainings.com/…
  • 该站点建议与其他站点相同,即:使用自定义配置文件创建 FFdriver 实例,然后使用 user:pass@domain.com 技巧。当我尝试它时,它不起作用。有趣的是,如果我在常规 FF 浏览器中手动尝试该 URL,我会收到以下消息:您将使用用户名“autotest”登录到站点“domain.net”,但该网站不需要身份验证。这可能是企图欺骗你。 “domain.net”是您要访问的网站吗?
  • 检查这个答案,使用 selenium 4 很容易stackoverflow.com/a/67321556/7604647

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


【解决方案1】:

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

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

解决办法如下:

#Step1:创建 chrome 扩展#

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

{ "name":"Web 请求 API", “版本”:“1.0”, "description":"处理身份验证窗口的扩展", "权限":["","webRequest","webRequestBlocking"], “背景”: { “脚本”:[“webrequest.js”] }, “清单版本”:2 }

  1. 在“extension”文件夹中创建一个名为“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. 配置您的 webdriver 创建以加载扩展,如
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

【讨论】:

  • 不错!另一种方法是添加解压后的扩展作为参数,例如options.AddArgument(@"--load-extension=" + Path.GetTempPath() + "\\extensionSource");,您可以在其中保存 .js 并清单到您选择的路径
  • 使用少量更新,需要检查以下网址 stackoverflow.com/questions/16612968/…stackoverflow.com/questions/48757424/…,因为几乎没有更改并且当前代码不起作用
  • 我无法正常工作。 addListener 现在已被弃用,因此不确定要使用什么,当我去生成包扩展时,我得到一个 Failed to output private key at root directory,尽管这被列为可选?
  • 我的代码在我的本地机器中,我在我没有任何访问权限的虚拟机中运行我的测试用例。我尝试了机器人(坐标)方法,但它不再起作用。按照上面提供的解决方案,将生成 .crx 文件。出现上述情况我该怎么办? @Bhuvanesh 马里
  • 您将在本地计算机上创建 .crx 文件。将此 .crx 插件与您的远程驱动程序实例结合起来,该驱动程序实例将发送到您的远程计算机,插件最终将被加载。即使我在远程硒网格上运行我的脚本,这也很好。
【解决方案2】:

*edit Chrome 不再支持此功能。

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

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

【讨论】:

  • 我已经尝试过了,但它对我不起作用。这可能是我们网站提示输入凭据的方式有问题,或者我没有正确设置 Chrome 以处理 user:pass@www.address.com
  • 这就是答案。我试图做“http://username:password@www.domain.com”。我需要做“httpS://username:password@domain.com”。
  • @TravisNeedham 我也在尝试,但它对我不起作用。我的密码已经包含@。那么在这种情况下我该如何处理呢?请建议
  • Chrome 不再支持此功能。 chromestatus.com/feature/5669008342777856 答案已过期。
  • @Vaibhav_Sharma 这仍然适用于 chrome。但是我们需要仔细观察 Web 应用程序是如何进行身份验证的。例如,应用程序 url 可能是 app.url,但是在点击 url 后,它会重定向到 auth.server.url。因此,如果您将用户名和密码附加到 app.url 中,它将不起作用。它应该附加到 auth.server.url。希望这会有所帮助。
【解决方案3】:

@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 实例。

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

额外的
如果您想查看控制台输出,请打开开发者模式并在 Chrome 的扩展程序屏幕中单击您的扩展程序的 Inspect views background page

【讨论】:

    【解决方案4】:

    我知道您的情况是 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();
    

    然后我使用一个测试用户帐户作为用户名和密码的值。

    【讨论】:

    • 我在 GoToUrl(url) 上遇到了超时,即使显示了警报。 Chrome v74 和 chromedriver v74。
    • 这对我不起作用,因为正如@SubjectiveReality 所说,它卡在调用 URL 本身,显示用户身份验证弹出窗口......很遗憾,还没有找到解决这个问题的方法!
    • @BhuvaneshMani 您可以使用 chrome.webRequest.onAuthRequired.addListener 的解压扩展启动 chrome,尽管这在无头模式下不起作用。
    • @SubjectiveReality 这似乎是一个有吸引力的解决方案,您是否有方便的 java 代码让我可以使用这种侦听器方法?同时我会尝试一下。
    • 没关系,我已经通过创建扩展解决了这个问题。
    【解决方案5】:

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

    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中有修复程序@

    【讨论】:

    • 这适用于我的本地设置,但 remoteWebDriver 尚不支持 HasAuthentication。
    猜你喜欢
    • 2014-08-09
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多