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 中定义的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript Uncaught ReferenceError: jQuery is not defined;未捕获的 ReferenceError:$ 未定义 [重复]