我的网站需要基本身份验证。当我通过主页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']
}
答案 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之类的代理处理基本身份验证。
以下是快速说明:
配置量角器以使用代理:在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'
},
},
在使用量角器运行规范之前启动并配置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'
只要您不依赖于websockets,这应该可以很好地工作(它适用于我)。
请注意,您还可以使用browsermob-proxy-api等节点模块从脚本控制browsermob-proxy。
答案 3 :(得分:0)
我正在使用以下解决方法:
首先,我传递了网址
中的凭据browser.get(`https://${username}:${password}@${hosts.baseURL}`);
所以此时我已通过身份验证。
然后我再次传递没有凭证的网址
browser.get(`https://${hosts.baseURL}`);
所以最后我有:
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);