量角器 - 空本地存储

时间:2014-06-13 12:55:27

标签: local-storage protractor

我使用Protractor(使用Jasmine)来测试我的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)

关于如何解决的任何想法?

提前致谢

6 个答案:

答案 0 :(得分:34)

另一个可能的解决方案是在afterEach中放置任何状态清除,该运行将在任何测试运行后运行:(参见https://github.com/angular/protractor/issues/188

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

答案 1 :(得分:14)

这是因为您还没有导航到有效的网址。在尝试与browser.get('/foo')等页面对象进行交互之前,请先localStorage

答案 2 :(得分:4)

我在尝试清除/修改sessionStorage或localStorage之前通过检查window.location来解决了这个问题。

如果尚未加载页面,则window.location.hostname将等于空字符串''。因此,如果您获得了emptystring,请不要尝试与sessionStoragelocalStorage进行互动。

这是我在量角器套件中用来防止此错误的一些(ES6)代码。注意它是一个黄瓜-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();
    }
  });
});

答案 3 :(得分: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 :(得分:1)

如果执行&#34; removeItem()&#34;时localStorage仍然存在问题,您可以使用try-catch,如:

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

答案 5 :(得分:1)

如果你想完全控制你的存储,使用这个类

class Storage {
    constructor(storage) {
        // 'localStorage' or 'sessionStorage'
        this.storage = storage;
    }

    /**
     * get local/session storage as object
     * @returns {Promise<Object>}
     */
    async get() {
        log(`${this.storage}.get()`);
        let keys = await browser.executeScript(`return Object.keys(window.${this.storage});`),
            storage = {};

        for (let key of keys) {
            storage[key] = await browser.executeScript(`return window.${this.storage}.getItem('${key}');`);
        }

        return storage;
    }

    /**
     * Clear local/session storage
     * @returns null
     */
    async clear() {
        log(`${this.storage}.clear()`);
        return browser.executeScript(`return window.${this.storage}.clear();`);
    }

    /**
     * Set a value of local/session storage
     * @param key
     * @param value
     * @returns
     */
    async setValue(key, value) {
        log(`${this.storage}.setValue(${key}, ${value})`);
        return browser.executeScript(`return window.${this.storage}.setItem('${key}', '${value}');`);
    }

    /**
     * Get value of a key of local/session storage
     * @param key
     * @returns
     */
    async getValue(key) {
        log(`${this.storage}.getValue(${key})`);
        return browser.executeScript(`return window.${this.storage}.getItem('${key}');`);
    }

    async removeItem(key) {
        log(`${this.storage}.removeItem(${key})`);
        return browser.executeScript(`return window.${this.storage}.removeItem('${key}');`);
    }
}

然后使用它

let sessionStorage = new Storage('sessionStorage'),
    localStorage = new Storage('localStorage');

// get storage as JSON
console.log(await sessionStorage.get())
// clear storage
await localStorage.clear();
// set key
await localStorage.setValue('key', 'value');
// and many more