根据我的经验,当使用 webdriver(通过 protractor )将 cookie 注入(inject) Firefox 上的浏览器 session 时,这可以正常工作:
browser.manager().addCookie(...)
其中“...”是一个“httpOnly”本地 session cookie,用于指示用户已登录。
在 Chrome 浏览器上运行相同的代码(使用直接的 ChromeDriver)不起作用。首先,有 localhost cookie 异常(exception):
Message:
InvalidCookieDomainError: invalid cookie domain: invalid domain:"localhost"
(Session info: chrome=41.0.2272.89)
(Driver info: chromedriver=2.14.313457 (3d645c400edf2e2c500566c9aa096063e707c9cf),platform=Linux 3.13.0-45-generic x86_64)
Stacktrace:
InvalidCookieDomainError: invalid cookie domain: invalid domain:"localhost"
(Session info: chrome=41.0.2272.89)
(Driver info: chromedriver=2.14.313457 (3d645c400edf2e2c500566c9aa096063e707c9cf),platform=Linux 3.13.0-45-generic x86_64)
即使我可以解决 localhost 问题(例如,通过设置完全限定的域),Chrome 也会忽略我对 cookie 的更改。
我在 Linux 上运行,使用 Protractor 2.0.0、google-chrome 41.0.xxx 和 chromedriver 2.14。
最佳答案
有两种解决方法适用于 Chrome,并且不会破坏 Firefox。
首先,使用 null
而不是 localhost
作为 cookie 域。 Chrome 会将其视为“与当前页面的域相同的页面”。这很好,因为您需要先让浏览器访问一个页面,然后才能设置 cookie。
其次,在设置新 cookie (browser.manager().deleteCookie()
) 之前清除现有 cookie。 Chrome 不允许(静默)通过 webdriver API 更改某些 cookie。通过删除 cookie,您就可以设置它。
// cookieObj is a "tough.Cookie" instance in my case
function setCookie(cookieObj) {
var domain = cookieObj.domain;
if (domain === 'localhost') {
domain = null;
}
var mgr = browser.manage();
var cName = cookieObj.key;
var cookieProm = mgr.deleteCookie(cName).then(function() {
return mgr.addCookie(
cName,
cookieObj.value,
cookieObj.path,
domain,
cookieObj.secure,
cookieObj.expiryTime());
});
cookieProm.then(function() {
mgr.getCookie(cName).then(function(cookie) {
console.log("Actual cookie", cName, "::", cookie);
expect(cookie.value).toBe(cookieObj.value);
});
});
return cookieProm;
}
关于google-chrome - 如何使用 webdriver 和 Chrome 在本地主机上可靠地设置 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29312226/