google-chrome - 如何使用 webdriver 和 Chrome 在本地主机上可靠地设置 cookie?

标签 google-chrome selenium cookies selenium-webdriver selenium-chromedriver

根据我的经验,当使用 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/

相关文章:

javascript - 如何自动填写表格

google-chrome - CSS3 flex-direction 属性在 Chrome 21 中失去作用?

python - 向下滚动无法正常工作(Python)

javascript - 在 Mac 上将 Behat 和 Mink 与 Selenium 和 Chrome 或 Safari 或 Firefox 连接

javascript - 如何仅将 cookie 设置为 WebBrowser 控件

cookies - macOS Paw - 解析请求 header 的响应 cookie

jquery - 等待 jQuery show() 完成后再继续执行函数?

python - Selenium 与 Chrome 一起工作,但不是 headless (headless)的 Chrome

python - 使用 Selenium 的下拉菜单和复选框 (python3)

.net - 在 ASP.NET 中使用新的 session ID 打开一个新的浏览器窗口