如何使用Webdriver和Chrome在本地主机上可靠地设置Cookie?

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。

P.T*_*.T. 5

有两种解决方法可与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)