在browser.get之前设置cookie

时间:2014-06-10 10:43:09

标签: angularjs protractor angularjs-e2e

我们的(PHP)应用程序需要设置某些cookie才能加载Angular.js客户端应用程序。如果未设置cookie,则抛出异常并显示错误页面。

这意味着为了运行E2E测试,我们需要设置cookie,但是由于Protractor试图在browser.get调用之后立即找到Angular(由于抛出异常而不存在),因此失败了。 / p>

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

我在设置Cookie后尝试拨打browser.get

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

但这会产生以下错误:

  

无法在'文档'上设置'cookie'属性:Cookie是   在'data:'网址内禁用。

有没有办法处理这种情况?或许告诉量角器在进行第一次browser.get调用时不检查Angular,或者在调用获取URL之前以某种方式为我们的域设置cookie?

3 个答案:

答案 0 :(得分:22)

我在Protractor Getting Started doc:

中找到了解决方案
browser.driver.get('http://' + domain + '/');
browser.manage().addCookie('foo', 'boo', '/', domain);

请注意browser.driver.get而不是browser.get。这将阻止量角器寻找Angular应用程序并且可以设置cookie。然后我在browser.get语句中使用了另一个it

答案 1 :(得分:0)

addCookie(具有较新的量角器版本(已通过5.4.2测试))改为使用IWebDriverOptionsCookie类型的对象。

注意:要获取Cookie,请使用getCookies

示例:

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

IWebDriverOptionsCookie文档:

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;
}

答案 2 :(得分:0)

只要browser.driver.get()返回一个承诺,您就应该考虑到它:

browser.driver.get('http://' + domain + '/').then(() => {
  browser.manage().addCookie({name: 'foo', value: 'boo'});
});

还请注意,在这种情况下,您不需要将域值传递给addCookie,因为量角器默认情况下将使用当前域。