Подтвердить что ты не робот

Транспортир - пустое местное хранилище

Я использую Protractor (с Жасмином), чтобы проверить приложение AngulaJs.

В результате некоторых моих действий я получаю некоторые данные, сохраненные в localStorage. Теперь мне нужно протестировать другой случай, поэтому мне нужно очистить мое хранилище (или лучше удалить только некоторые элементы), но если я попытаюсь запустить:

browser.executeScript('localStorage.removeItem("config");');

Я получаю следующую ошибку:

UnknownError: <unknown>: Failed to read the 'localStorage' property from 'Window': Storage is disabled inside 'data:' URLs.
  (Session info: chrome=35.0.1916.153)
  (Driver info: chromedriver=2.10.267517,platform=Mac OS X 10.9.2 x86_64)

Любая идея о том, как решить?

Заранее спасибо

4b9b3361

Ответ 1

Другим потенциальным решением является установка любой очистки состояния в afterEach, которая будет запускаться после запуска любого теста: (см. https://github.com/angular/protractor/issues/188)

afterEach(function() {
    browser.executeScript('window.sessionStorage.clear();');
    browser.executeScript('window.localStorage.clear();');
});

Ответ 2

Это потому, что вы еще не перешли к действительному URL-адресу. Сделайте browser.get('/foo'), прежде чем пытаться взаимодействовать с объектами страницы, такими как localStorage.

Ответ 3

Я не нашел классного способа сделать это, но если я запустил свой оператор

 browser.executeScript("localStorage.removeItem('config');")

внутри оператора it ('description') он работает. Пример:

it('should compile and save base config for billing',function(){
    browser.executeScript("localStorage.removeItem('config');")

    //my test
});

Это удалит элемент с именем config, и поэтому мой тест работает, но при поиске и обсуждении этой проблемы основной ответ, который я получил, это:

"localStorage не является вашим продуктом, поэтому вам не нужно (читайте: вы не должны) его проверять. Правильный способ - издеваться над ним и вводить его содержимое, когда они необходимы"

Я все еще смотрю на это, чтобы понять, как, между тем, я думаю, что не философски совершенный тест по-прежнему лучше, чем ничего.

Надеюсь, что это поможет...

Ответ 4

Я решил эту проблему, проверив window.location, прежде чем пытаться очистить/изменить sessionStorage или localStorage.

Если страница не была загружена, то window.location.hostname будет равна пустой строке ''. Поэтому, если вы получаете emptystring, тогда не пытайтесь взаимодействовать с sessionStorage или localStorage.

Вот некоторый (ES6) код, который я использовал в моем пакете транспортира, чтобы предотвратить эту ошибку. Обратите внимание, что это функция cucumber-js After, но она по-прежнему выполняется из транспортира, использующего хром, и демонстрирует, что вам нужно сделать, чтобы избежать этой ошибки:

this.After(function(scenario) {

  function getWindowLocation() {
    return window.location;
  }

  function clearStorage() {
    window.sessionStorage.clear();
    window.localStorage.clear();
  }

  return browser.executeScript(getWindowLocation).then(function(location) {
    // NB If no page is loaded in the scneario then calling clearStorage will cause exception
    // so guard against this by checking hostname (If no page loaded then hostname == '')
    if (location.hostname.length > 0) {
      return browser.executeScript(clearStorage);
    }
    else {
      return Promise.resolve();
    }
  });
});