【问题标题】:How to handle basic authentication with protractor?如何使用量角器处理基本身份验证?
【发布时间】:2014-12-01 18:25:48
【问题描述】:

我正在尝试量角器在非角度应用程序中编写一些测试。我必须通过谷歌浏览器中的基本身份验证登录页面,但我不知道如何。

我已经尝试过baseUrl: 'https://username:password@url'capabilities: { 'browserName': 'chrome', 'chromeOptions' : { args: ['--login-user=foo', '--login-password=bar'] } }

但如果这些对我有用,则没有。有谁知道该怎么做?我在这方面遇到了一些困难。

【问题讨论】:

标签: javascript jasmine protractor


【解决方案1】:

从 59 版开始,Chrome no longer supports 带有嵌入凭据的 URL。

为了解决这个问题,我编写了authenticator-browser-extension Node 模块,如果您使用 Protractor、WebDriver.io 或类似的测试运行器,它可能会很有用。

要使用该模块,请从 npm 安装它:

npm install --save-dev authenticator-browser-extension

并导入protractor.conf.js:

const { Authenticator } = require('authenticator-browser-extension');

exports.config = {
    capabilities: {
        browserName: 'chrome',

        chromeOptions: {
            extensions: [
                Authenticator.for('username', 'password').asBase64()
            ]
        }
    },
}

专业提示:记住不要在代码中提交凭据,考虑改用env variables

希望这会有所帮助!

一月

【讨论】:

  • 我无法让它工作,扩展没有做任何事情。
  • 嘿,Rami,authenticator-browser-extension 目前没有报告任何问题,并且已经过全面测试,以确保它按宣传的那样工作。如果您发现问题,请在 Github 上报告,以便调查,谢谢! github.com/jan-molak/authenticator-browser-extension/issues
  • 我确实成功了。它不适用于隐身模式。以及如何将凭据移动到环境变量?这似乎是不可能的。无法将 Env 导入量角器配置文件。
  • "Env 无法导入" - 尝试使用process.env.YOUR_ENV_VAR_NAME
  • ahhh,所以这是用于使用 windows env 变量而不是 angular environment.ts?
【解决方案2】:

简短的回答是在 chrome 上没有简单的方法可以做到这一点,因为它们不支持修改请求标头 - 请参阅 https://code.google.com/p/selenium/issues/detail?id=141(标题表示响应标头,但如果您阅读它,它适用于所有标头)。

话虽如此,有办法做到这一点,尽管很困难。

1) 找到一个允许您修改标题的 chrome 扩展/插件。一个简单的搜索就可以找到很多:https://chrome.google.com/webstore/search/modify%20header。您需要将插件添加到 webdriver:请参阅 Is it possible to add a plugin to chromedriver under a protractor test?

2) 你可以使用 browsermob-proxy (https://github.com/lightbody/browsermob-proxy);这样,您可以通过代理路由您的流量,这将为您添加标头。 来自文档:

POST /proxy/[port]/auth/basic/[domain] - Sets automatic basic authentication for the specified domain
Payload data should be json encoded username and password name/value pairs (ex: {"username": "myUsername", "password": "myPassword"}

有一个节点项目可以帮助您,https://github.com/zzo/browsermob-node,但您仍然需要自己设置代理服务器。

chrome 的两种方法都很复杂,但都能得到你想要的。 (或者你可以坚持使用 Firefox 并按照罗伯特的回答)

【讨论】:

    【解决方案3】:

    事实上,你可以将 url 设置为http://username:password@yourdomain.com。铬会处理它!

    【讨论】:

    • 如何将用户名与域一起传递?我已经尝试过这种方法,但是当用户名的模式为 domain\user:pass@www.somesite.com 时它会失败
    • 我尝试了所有用户名和密码的组合,但对我不起作用
    • 以防万一其他人想知道,aplon 问题的答案是用 %5C 转义反斜杠,所以它是 domain%5Cuser:pass@www.somesite.com
    • 这将不再适用于 Chrome 59+(chromestatus.com/features/5669008342777856)
    • 我有一个网站http://example.com/test,所以我将baseURL 设为http://username:password@example.com/test,但它已超时且无法加载。
    【解决方案4】:

    这是因为默认情况下 Firefox 不信任任何网站来发送 Windows 身份验证信息。即使您在配置中手动更改它,它也不会影响量角器,因为它会在您每次运行端到端测试时以隔离配置打开 Firefox。

    您需要以编程方式设置 Firefox 配置文件并设置其首选项,使其信任 localhost(或其他一些网站,具体取决于页面的加载位置)

    首先,看看这个例子。它显示了如何设置配置文件以及如何设置首选项。

    https://github.com/juliemr/protractor-demo/tree/master/howtos/setFirefoxProfile

    它的作用是修改每个新标签的主页。以同样的方式(使用 firefoxProfile.setPreference 方法),您可以更改负责信任网站的首选项。它们被称为“network.automatic-ntlm-auth.trusted-uris”和“network.negotiate-auth.delegation-uris”。您需要将它们都设置为“localhost”。 (同样,如果他们在其他地方,显然是那个 url)

    这应该可以解决它:)

    【讨论】:

    • 感谢您的完整回答。但我正在寻找 chrome 的解决方案 :(
    • 哦,那么对不起。我今天在使用 Firefox 时遇到了完全相同的问题,我认为您也遇到了同样的问题,我会在完成后回复您。无论如何,我不确定为什么它会在 chrome 中这样做。希望你能找到答案:)
    【解决方案5】:

    hankduan 的 browsermob-proxy 解决方案在 Chrome 上为我工作 - 但是 browsermob 的最新版本使用了一个名为 littleproxy 的东西,它不支持 auth 标头。因此我不得不做browsermob-proxy -port 9090 --use-littleproxy false,这让事情变得正常。

    【讨论】:

      【解决方案6】:

      您可以使用 Windows 凭据管理器来避免在每次尝试登录时不断显示此弹出窗口。

      将您的凭据添加到那里的“通用”类别,重新启动浏览器(包括正在运行的后台应用程序)。

      我目前的一些解释:这个弹出窗口不是“浏览器”特定的,它是“在中间”,在浏览器和域凭据验证之间。因此浏览器功能(保存密码、自动填充)不能完全工作。出于同样的原因,Protractor / Selenium 等无法完全控制该弹出窗口 - 这是域身份验证的设计。

      不完全确定这是否是唯一原因,还有其他一些提示: - 您可能还需要将您的站点添加到受信任站点的 IE(IE,而不是 Chrome)列表(Chrome 从那里获取信息); - 在 IE(不是 Chrome)中选中“使用当前用户名和密码自动登录” - 如果您用于网站的凭据与您用于登录机器的凭据不同,则可能无法正常工作。

      【讨论】:

        【解决方案7】:

        如果您在 2019 年使用 Angular 7/8 阅读本文,请考虑以下内容:

        https://www.npmjs.com/package/authenticator-browser-extension

        我发现它比上面建议的解决方案容易得多。

        【讨论】:

        • 你成功了吗?就我而言,它什么都不做,绝对什么都没有:(
        • 您能分享一下您是如何集成它的吗?你在用最新的 chrome webdriver 吗?
        • 是的,我正在使用最新的网络驱动程序。为了确保这一点,我在我的 package.json 中添加了一个pree2e 任务:"pree2e": "cd ./node_modules/protractor/ && npm i webdriver-manager@latest && cd ../.. && webdriver-manager update"。 e2e 任务因此更改:"e2e": "ng e2e --webdriver-update false"。但这些与身份验证无关。添加 npm 模块作为开发依赖项后,我将其放入 protractor.conf.js:capabilities: { 'browserName': 'chrome', chromeOptions: { extensions: [ Authenticator.for(protractor_user, protractor_password).asBase64() ] } }。希望对您有所帮助。
        • 正是我所做的......但它不会在通过提示符内填写密码......
        • 那么您的身份验证类型可能不同。另外,我不知道您是否已经在 npm 包说明中阅读过此内容,但这不适用于无头 Chrome。顺便说一句,这不是“在通过提示中填写密码”,即没有可视形式填写,登录/身份验证是透明地完成的,你看不到任何弹出提示。跨度>
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多