Установка файлов cookie перед browser.get

Наше (PHP) приложение требует установки определенных файлов cookie для загрузки клиентского приложения Angular.js. Если файлы cookie не установлены, создается исключение и отображается страница с ошибкой.

Это означает, что для запуска тестов E2E нам нужно установить файлы cookie, но следующее не удается, потому что Protractor пытается найти Angular сразу после вызова browser.get (его нет, потому что было выдано исключение).

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

Я попытался позвонить browser.get после установки файлов cookie:

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

Но это приводит к следующей ошибке:

Не удалось установить свойство «cookie» в «Документе»: файлы cookie отключены внутри URL-адресов «data:».

Есть ли способ справиться с этой ситуацией? Возможно, чтобы указать Protractor не проверять Angular при выполнении первого вызова browser.get или каким-то образом установить файлы cookie для нашего домена перед вызовом получения URL-адреса?


person Petr Peller    schedule 10.06.2014    source источник


Ответы (3)


Я нашел решение в Protractor. Начат документ:

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

Обратите внимание на browser.driver.get вместо browser.get. Это предотвратит поиск Protractor приложения Angular, и можно будет установить файлы cookie. Затем я использую еще один browser.get внутри оператора it.

person Petr Peller    schedule 10.06.2014
comment
Спасибо за написание примера использования webdriver.WebDriver.Options путем вызова .manage(). Потому что предоставленная вами ссылка не дает никакого представления о том, как использовать этот конкретный API. - person Reydi Sutandang; 18.04.2015
comment
Я нахожу документацию транспортира в целом неполной или неправильной, такие примеры чрезвычайно полезны. Спасибо. - person T.W.R. Cole; 27.08.2015
comment
Для тех, кто видел это в 2019 году, browser.manage().addCookie() теперь ожидает объект. browser.manage().addCookie({name: 'foo', value: 'bar'}) - person DarthOpto; 08.08.2019

addCookie с более новыми версиями Protractor (протестировано с 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;
}
person Abido    schedule 22.11.2019

Поскольку browser.driver.get() возвращает промис, вы должны это учитывать:

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

Также обратите внимание, что в этом случае вам не нужно передавать значение домена в addCookie, потому что транспортир будет использовать текущий домен по умолчанию.

person DerBesondereEin    schedule 21.07.2020