ReferenceError:localStorage 未在 Object 中定义

Posted

技术标签:

【中文标题】ReferenceError:localStorage 未在 Object 中定义【英文标题】:ReferenceError: localStorage is not defined at Object 【发布时间】:2022-01-14 03:58:48 【问题描述】:

我每次运行测试用例时都使用本地存储来保存更新变量值,但由于某些原因,我得到了错误:

ReferenceError:localStorage 未在 Object ReferenceError 中定义: 在 Object.localStorage 中没有定义。 (/app/Projects/javascript/Mocha/27403_9907/Libraries/addNewBeneficiary.js:17:49) 在 Module._compile (internal/modules/cjs/loader.js:1085:14) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) 在 Module.load (internal/modules/cjs/loader.js:950:32) 在 Function.Module._load (internal/modules/cjs/loader.js:790:12) 在 Module.require (internal/modules/cjs/loader.js:974:19) at require (内部/模块/cjs/helpers.js:93:18)在对象。 (/app/Projects/Javascript/Mocha/27403_9907/run/test.js:13:39)在 Module._compile (internal/modules/cjs/loader.js:1085:14) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) 在 Module.load (internal/modules/cjs/loader.js:950:32) 在 Function.Module._load (internal/modules/cjs/loader.js:790:12) 在 模块包装。 (内部/模块/esm/translators.js:199:29)在 ModuleJob.run (internal/modules/esm/module_job.js:183:25) 异步 Loader.import (internal/modules/esm/loader.js:178:24) 异步 格式化导入 (/usr/lib/node_modules/mocha/lib/nodejs/esm-utils.js:7:14) 在异步 Object.exports.requireOrImport (/usr/lib/node_modules/mocha/lib/nodejs/esm-utils.js:48:32) 在异步 Object.exports.loadFilesAsync (/usr/lib/node_modules/mocha/lib/nodejs/esm-utils.js:88:20) 在异步 singleRun (/usr/lib/node_modules/mocha/lib/cli/run-helpers.js:125:3) 在异步 Object.exports.handler (/usr/lib/node_modules/mocha/lib/cli/run.js:374:5)

我创建了一个 JS 文件并将其上传到一个名为 Momentum 的自定义平台,我们将其用于自动化测试。代码文件如下:

const  wd  = require("../setup/v2setup");

                    var isStepFailed = false;

                    var assert = require('assert');
                    var should = require('should');
                    var windowSize = null;
                    const axios = require('axios').default;

let storedXPathIndex = localStorage.getItem("storedXPathIndex");
                    let xPathIndex = (storedXPathIndex) ? ++storedXPathIndex : 0;
                    localStorage.setItem("storedXPathIndex", xPathIndex);
                    const max = 5;

                    exports.setAddNewBeneficiaryMethods = (driver) =>

wd.addPromiseChainMethod('SelectAcc', () => 


                    
   if( ++xPathIndex > max ) xPathIndex = 0;
    return 

driver.swipeUntilElement("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.ScrollView/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup["+ xPathIndex +"]")
)

我还尝试了下面建议的模拟函数,现在我得到了

没有定义窗口

模拟函数以及我如何称呼它

function storageMock() 
let storage = ;

return 
  setItem: function(key, value) 
    storage[key] = value || '';
  ,
  getItem: function(key) 
    return key in storage ? storage[key] : null;
  ,
  removeItem: function(key) 
    delete storage[key];
  ,
  get length() 
    return Object.keys(storage).length;
  ,
  key: function(i) 
    const keys = Object.keys(storage);
    return keys[i] || null;
  

  

wd.addPromiseChainMethod('SelectAcc', () => 

 let storedXPathIndex = window.localStorage.getItem("storedXPathIndex");
                let xPathIndex = (storedXPathIndex) ? ++storedXPathIndex : 0;
                window.localStorage.setItem("storedXPathIndex", xPathIndex);

不知道我哪里做错了 常量最大值 = 5;

   if( ++xPathIndex > max ) xPathIndex = 0;
    return 

driver.swipeUntilElement("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.ScrollView/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup["+ xPathIndex +"]")
)

【问题讨论】:

localStorage is on the web 不在 Node.JS 中。但是,除非你有一些额外的库来添加它,否则我希望你能导入它,如果是这样的话。 【参考方案1】:

localStorage 仅在浏览器中可用,因此,如果您想运行测试,您需要按照关于 how to use localStorage in tests 的答案中的说明模拟对象,但这里有一个偷看:

function storageMock() 
    let storage = ;

    return 
      setItem: function(key, value) 
        storage[key] = value || '';
      ,
      getItem: function(key) 
        return key in storage ? storage[key] : null;
      ,
      removeItem: function(key) 
        delete storage[key];
      ,
      get length() 
        return Object.keys(storage).length;
      ,
      key: function(i) 
        const keys = Object.keys(storage);
        return keys[i] || null;
      
    ;
  

// mock the localStorage
window.localStorage = storageMock();

【讨论】:

我用你建议的模拟更新了我的问题,但现在我收到错误“未定义窗口”。也许你可以看看并有什么建议? @Farzin Farzanehnia 那只是为了解释,我看不出你在哪里使用storageMock(),但在你的测试运行之前,请确保执行const localStorage = storageMock()之类的操作,这样应该可以。

以上是关于ReferenceError:localStorage 未在 Object 中定义的主要内容,如果未能解决你的问题,请参考以下文章

ReferenceError:未定义 DartObject

ReferenceError:未定义提取

Rails:ReferenceError:未定义谷歌

ReferenceError:变量未定义

JavaScript Uncaught ReferenceError: jQuery is not defined;未捕获的 ReferenceError:$ 未定义 [重复]

ReferenceError:找不到变量