Транспортир - пустое местное хранилище
Я использую 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)
Любая идея о том, как решить?
Заранее спасибо
Ответы
Ответ 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();
}
});
});