google-chrome – 如何使用webdriver和Chrome在localhost上可靠地设置cookie?

根据我的经验,当使用webdriver(通过Protractor)将cookie注入Firefox上的浏览器会话时,这样可以正常工作:

browser.manager().addCookie(...)

其中“…”是用于表示用户已登录的“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)

即使我可以解决localhost问题(例如,通过设置完全限定的域),Chrome也会忽略我对cookie的更改.

我在Linux上运行,使用Protractor 2.0.0,google-chrome 41.0.xxx和chromedriver 2.14.

最佳答案
有两种解决方法适用于Chrome,不会破坏Firefox.

首先,使用null而不是localhost作为cookie域. Chrome会将此视为“与当前页面的域名相同的页面”.这很好,因为您需要让浏览器访问页面,然后才允许您设置cookie.

其次,在设置新cookie之前清除现有cookie(browser.manager().deleteCookie()). 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在localhost上可靠地设置cookie? - 代码日志