如何从Chrome扩展程序获取当前标签页的sessionStorage?
解决Chrome扩展获取sessionStorage返回空对象的问题
嘿,我懂你现在的困扰——调用chrome.tabs.executeScript拿sessionStorage结果却只得到[{}],对吧?这其实是因为你漏了一个关键细节:Storage对象没法直接被序列化传递回扩展上下文。
问题根源
当你直接返回window.sessionStorage时,Chrome的脚本执行机制在序列化这个对象的时候,没办法正确提取它里面的键值对。因为sessionStorage是Storage接口的实例,它的属性是通过原型链动态暴露的,不是普通对象的可枚举自身属性,所以序列化后就变成了空对象。
修复方案
你需要在注入的脚本里,把sessionStorage的内容转换成普通JavaScript对象,这样就能被正确序列化并传递回来。这里有两种常用写法:
写法1:传统遍历方式(兼容性拉满)
function getSessionStorage() { const script = ` const storageData = {}; // 遍历sessionStorage所有键,逐个取出对应值 for (let i = 0; i < sessionStorage.length; i++) { const key = sessionStorage.key(i); storageData[key] = sessionStorage.getItem(key); } storageData; // 返回转换后的普通对象 `; chrome.tabs.executeScript({ code: script }, function(results) { console.log(results[0]); // 现在就能拿到完整的sessionStorage内容啦 }); }
写法2:ES6简洁写法(现代浏览器适用)
如果你的目标环境支持ES6,可以用更清爽的方式转换:
function getSessionStorage() { const script = ` // 把sessionStorage的键值对直接转成普通对象 Object.fromEntries(Array.from(sessionStorage.entries())); `; chrome.tabs.executeScript({ code: script }, function(results) { console.log(results[0]); }); }
额外提醒:权限检查
别忘了在扩展的manifest.json里声明必要权限,比如activeTab(允许在当前激活标签页执行脚本)或者特定域名权限,否则脚本会执行失败:
{ "manifest_version": 3, // 或根据你的扩展版本填2 "permissions": ["activeTab"] }
这样调整之后,你应该就能顺利获取到当前标签页的sessionStorage内容了!
内容的提问来源于stack exchange,提问作者itamar
相关产品推荐
相关产品推荐

