P.T*_*.T. 5 cookies selenium google-chrome selenium-chromedriver selenium-webdriver
以我的经验,当使用webdriver(通过Protractor)将cookie注入Firefox上的浏览器会话时,这可以很好地工作:
browser.manager().addCookie(...)
Run Code Online (Sandbox Code Playgroud)
其中“ ...”是一个“ httpOnly” localhost会话cookie,用于指示用户已登录。
在Chrome浏览器(使用直接的ChromeDriver)上运行时,相同的代码不起作用。首先,有localhost cookie例外:
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)
Run Code Online (Sandbox Code Playgroud)
即使我可以解决本地主机问题(例如,通过设置完全限定的域),Chrome也会忽略对cookie的更改。
我在Linux上运行,带有Protractor 2.0.0,google-chrome 41.0.xxx和chromedriver 2.14。
有两种解决方法可与Chrome一起使用,并且不会破坏Firefox。
首先,使用null代替localhostcookie域。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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4229 次 |
| 最近记录: |