基本身份验证阻止页面加载

时间:2017-06-10 05:07:17

标签: javascript angularjs protractor

  • 节点版本:7.8.0
  • 量角器版本:5.1.2
  • Angular Version:1.5.3
  • 浏览器:Chrome 59
  • 操作系统和版本OSX 10.12.5

我的网站需要基本身份验证。当我通过主页url传递凭据时,这一直运行正常。

browser.get(`https://${username}:${password}@${hosts.baseURL}`);

然而,在今天对Chrome 59的自动更新后,这停止了工作。该页面将无法加载。我得到一个空白页。

我发现如果从网址中删除凭据,页面将加载正常,但我必须手动输入凭据。不确定基本身份验证是否是问题。 有人知道可能的原因/解决方案吗?

感谢。

更新: 事实证明@mplungjan是正确的。 Chrome v58中添加了更改基本身份验证工作方式的标志,并在v59中强制执行。这基本上打破了我的所有测试。经过几次ocomplaints后,它将在v61和v60中更改回来。要使Chrome在使用基本身份验证时能够像在更改之前一样运行,请将以下内容添加到chrome选项中:

chromeOptions: {
  args: ['--disable-blink-features=BlockCredentialedSubresources']
}

4 个答案:

答案 0 :(得分:2)

它已经消失了:

Evaluate dropping legacy and credentialed subresource requests.

启用阻止其URL包含凭据的子资源请求。

这个补丁翻转了BlockCredentialedSubresources'标记为'稳定'和 将它绑定到//内容中的功能标志,我们可以将其用作kill开关if 事实证明,该功能的企业使用率高于我们的希望 (总体数字看起来仍然相当低[1])。

意图:https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/lx-U_JR2BF0

答案 1 :(得分:1)

我正在尝试将disable-blink-features=BlockCredentialedSubresources添加到chromeOptions config.js中,并且该文件对我有效!

<强> config.js:

exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',

capabilities: {
    "browserName": 'chrome',
"chromeOptions": {
 args:['--disable-blink-features=BlockCredentialedSubresources']
},
specs: ['filename.js']
}
}; 

符合规范:

browser.get('http://username:password@domain.com');

我确保使用网址保留凭据。我一开始尝试把它取出来然后失败了,然后重新加入并且效果很好。

答案 2 :(得分:0)

您可以使用browsermob-proxy之类的代理处理基本身份验证。

以下是快速说明:

  1. 下载并解压缩browsermob-proxy
  2. 配置量角器以使用代理:在protractor.conf.js中,为您的功能添加代理部分,例如:

    capabilities: {
        browserName: 'chrome',
        'chromeOptions': {
            'args': ['disable-infobars=true'],
            'prefs': {'credentials_enable_service': false}
        },
        'proxy': {
             'proxyType': 'manual',
             'httpProxy': 'localhost:8888',
             'sslProxy': 'localhost:8888'  
        },
     },
    
  3. 在使用量角器运行规范之前启动并配置browsermob代理(8080是用于通过其REST api控制browsermob的端口,8888是实际的代理端口):

    $ browsermob-proxy --use-littleproxy false
    $ curl -s --request POST --url http://localhost:8080/proxy?port=8888
    $ curl -s --request POST --url \
      http://localhost:8080/proxy/8888/auth/basic/your.site.com \
      --data '{"username":"yourUsername","password":"yourPassword"}' \
      -H 'Content-type: application/json'
    
  4. 只要您不依赖于websockets,这应该可以很好地工作(它适用于我)。

    请注意,您还可以使用browsermob-proxy-api等节点模块从脚本控制browsermob-proxy。

答案 3 :(得分:0)

我正在使用以下解决方法:

  1. 首先,我传递了网址

    中的凭据
    browser.get(`https://${username}:${password}@${hosts.baseURL}`);
    

    所以此时我已通过身份验证。

  2. 然后我再次传递没有凭证的网址

    browser.get(`https://${hosts.baseURL}`);
    
  3. 所以最后我有:

        browser.get(`https://${username}:${password}@${hosts.baseURL}`);
        browser.get(`https://${hosts.baseURL}`);
    

    同样的事情可以使用任何测试框架(我使用的是Protractor和Codeception)。

    因此,例如在Codeception中,如果带有auth凭据的URL在.yml文件中定义:

        $I->amOnPage('/');
        $I->amOnUrl(`https://`.$baseURL);
    

    或者只是

        $I->amOnUrl(`https://`.$username.`:`.$password.`@`.$baseURL);
        $I->amOnUrl(`https://`.$baseURL);