Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting cookies before browser.get

Our (PHP) application requires certain cookies to be set in order to load an Angular.js client app. If the cookies are not set an exception is thrown and error page is shown.

This means in order to run E2E tests we need to set the cookies, but the following fails because Protractor is trying to find Angular right after the browser.get call (it's not there because the exception was thrown).

browser.get('http://' + domain + '/');
browser.manage().addCookie('foo', 'boo', '/', domain);

I tried to call browser.get after setting the cookies:

browser.manage().addCookie('foo', 'boo', '/', domain);
browser.get('http://' + domain + '/');

But this produces the following error:

Failed to set the 'cookie' property on 'Document': Cookies are disabled inside 'data:' URLs.

Is there a way how to handle this situation? Perhaps to tell Protractor not to check for Angular when doing the first browser.get call or somehow set cookies for our domain before calling getting the URL?

like image 797
Petr Peller Avatar asked Jun 10 '14 10:06

Petr Peller


People also ask

Are cookies set automatically?

Cookies are usually set by a web-server using the response Set-Cookie HTTP-header. Then, the browser automatically adds them to (almost) every request to the same domain using the Cookie HTTP-header.

How do I know where my cookies are set?

Tip: To find how a cookie is set, press Cmd+F (Mac) or Ctrl+F on the Network panel to open the search box and type "Set-Cookie". Or, press Cmd+Opt+F (Mac) or Ctrl+Shift+F to open the Search tab, and type "document. cookie".


2 Answers

I found the solution in the Protractor Getting Started doc:

browser.driver.get('http://' + domain + '/');
browser.manage().addCookie('foo', 'boo', '/', domain);

Note the browser.driver.get instead of browser.get. This will prevent Protractor looking for the Angular app and cookies can be set. I then use another browser.get inside of it statement.

like image 166
Petr Peller Avatar answered Oct 19 '22 07:10

Petr Peller


addCookie with newer Protractor versions (tested with 5.4.2) takes an object of type IWebDriverOptionsCookie instead.

Note: to fetch the cookie use getCookies

Example:

browser.manage().addCookie({ name: 'foo', value: 'bar' });

IWebDriverOptionsCookie documentation:

interface IWebDriverOptionsCookie {
  /** The name of the cookie. */
  name: string;

  /** The cookie value. */
  value: string;

  /** The cookie path. Defaults to "/" when adding a cookie. */
  path?: string;

  /**
   * The domain the cookie is visible to. Defaults to the current browsing
   * context's document's URL when adding a cookie.
   */
  domain?: string;

  /**
   * Whether the cookie is a secure cookie. Defaults to false when adding a new
   * cookie.
   */
  secure?: boolean;

  /**
   * Whether the cookie is an HTTP only cookie. Defaults to false when adding a
   * new cookie.
   */
  httpOnly?: boolean;

  /**
   * When the cookie expires.
   *
   * When adding a cookie, this may be specified in seconds since Unix epoch (January 1, 1970).
   * The expiry will default to 20 years in the future if omitted.
   *
   * The expiry is always returned in seconds since epoch when
   * retrieving cookies from the browser.
   *
   * @type {(!Date|number|undefined)}
   */
  expiry?: number | Date;
}
like image 6
Abido Avatar answered Oct 19 '22 09:10

Abido