web-dev-qa-db-ja.com

分度器-空のローカルストレージ

私は、AngulaJsアプリケーションのテストにProtractor(Jasmineを使用)を使用しています。

私のアクションの一部の結果として、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)

解決方法についてのアイデアはありますか?

前もって感謝します

24
teone

別の潜在的な解決策は、任意のテストが実行された後に実行されるafterEachで任意の状態クリアを配置することです:( https://github.com/angular/protractor/issues/188 を参照)

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

有効なURLにまだ移動していないためです。 localStorageのようなページオブジェクトを操作する前に、browser.get('/foo')を実行してください。

19
Jed Richards

この問題は、sessionStorageまたはlocalStorageをクリア/変更する前にwindow.locationを確認することで解決しました。

ページがロードされていない場合、window.location.hostnameは空の文字列''と等しくなります。したがって、空の文字列を取得した場合は、sessionStorageまたはlocalStorageを操作しないでください。

これは、このエラーを防ぐために分度器スイートで使用した(ES6)コードの一部です。これはcucumber-js After関数ですが、それでもchromeを使用して分度器から実行され、このエラーを回避するために必要なことを示しています。

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

それを行うためのクールな方法は見つかりませんでしたが、ステートメントを実行すると

 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はあなたの製品ではないので、テストする必要はありません(読み取り:してはいけません)。正しい方法は、それを模擬し、必要なときにコンテンツを注入することです。」

私はまだこれをどのように理解しているかを調査していますが、一方で哲学的に完全ではないテストはまだ何もないよりはましだと思います。

お役に立てれば...

3
teone

「removeItem()」を実行してもlocalStorageに問題がある場合は、次のようなtry-catchを使用できます。

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