web-dev-qa-db-fra.com

Rapporteur - stockage local vide

J'utilise Protractor (avec Jasmine) pour tester mon application AngulaJs.

À la suite de certaines de mes actions, j'obtiens des données enregistrées dans le localStorage. Maintenant, je dois tester un autre cas, donc je dois vider mon stockage (ou mieux supprimer uniquement certains éléments), mais si j'essaie de lancer:

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

J'obtiens l'erreur suivante:

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)

Une idée sur la façon de résoudre?

Merci d'avance

24
teone

Une autre solution potentielle consiste à mettre tout effacement d'état dans un afterEach, qui s'exécutera après l'exécution de tout test: (voir https://github.com/angular/protractor/issues/188 )

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

C'est parce que vous n'avez pas encore accédé à une URL valide. Faites une browser.get('/foo') avant d'essayer d'interagir avec des objets de page comme localStorage.

19
Jed Richards

J'ai résolu ce problème en vérifiant le window.location avant d'essayer d'effacer/modifier sessionStorage ou localStorage.

Si une page n'a pas été chargée, window.location.hostname sera égal à la chaîne vide ''. Donc, si vous obtenez la chaîne vide, n'essayez pas d'interagir avec sessionStorage ou localStorage.

Voici du code (ES6) que j'ai utilisé dans ma suite de rapporteurs pour éviter cette erreur. Notez qu'il s'agit d'une fonction Cucumber-js After, mais qu'elle est toujours exécutée à partir du rapporteur en utilisant Chrome, et elle montre ce que vous devez faire pour éviter cette erreur:

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();
    }
  });
});
5
zayquan

Je n'ai pas trouvé de moyen sympa de le faire, mais si je lance ma déclaration

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

dans une instruction it ("description"), cela fonctionne. Exemple:

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

    //my test
});

Cela supprime l'élément nommé config, et donc mon test fonctionne, mais lors de la recherche et de la discussion sur ce problème, la principale réponse que j'ai obtenue est:

"localStorage n'est pas votre produit, vous n'avez donc pas besoin (lisez: vous ne devez pas) de le tester. La bonne façon est de se moquer de lui et de lui injecter le contenu quand il le faut"

J'essaie toujours de comprendre comment, en attendant, je pense qu'un test non parfait sur le plan philosophique est encore mieux que rien.

J'espère que cela t'aides...

3
teone

S'il y a toujours un problème avec le localStorage lors de l'exécution d'un "removeItem ()", vous pouvez utiliser un try-catch, comme:

browser.executeScript("try {localStorage.removeItem('access_token');} catch(exception) {}");
1
Guntram