You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Playwright获取sessionStorage遇空值问题求助(C#/.NET6)

解决Playwright C#获取sessionStorage值为null的问题

核心原因

你的代码正常运行时返回null,但调试断点能看到值,本质是时机问题——登录后页面的异步操作还没完成将settingsObj写入sessionStorage,代码就提前执行了;而调试时断点暂停给了足够时间,异步操作完成后sessionStorage已有值。

解决方案

1. 先等待sessionStorage项存在

用Playwright的WaitForFunctionAsync等待settingsObj被写入,确保获取时机正确:

// 等待settingsObj出现在sessionStorage,超时5秒(可根据实际调整)
await Page.WaitForFunctionAsync("() => sessionStorage.getItem('settingsObj') !== null", new WaitForFunctionOptions { Timeout = 5000 });

2. 正确获取并解析值

sessionStorage存储的是字符串,直接获取后反序列化即可,无需额外JSON.stringify(原代码的JSON.stringify会把null转为"null"字符串,反而干扰判断):

方式一:反序列化为自定义实体类

假设你有对应settingsObj结构的实体类SettingsObj:

using System.Text.Json;

// 获取sessionStorage中的字符串值
var settingsObjStr = await Page.EvaluateAsync<string>("() => sessionStorage.getItem('settingsObj')");

// 反序列化为实体类
var settingsObj = JsonSerializer.Deserialize<SettingsObj>(settingsObjStr);

// 输出验证
Console.WriteLine($"STORAGE? {JsonSerializer.Serialize(settingsObj)}");

方式二:解析为动态对象(无需实体类)

如果不需要强类型,可使用Newtonsoft.Json解析为JObject:

using Newtonsoft.Json.Linq;

var settingsObjStr = await Page.EvaluateAsync<string>("() => sessionStorage.getItem('settingsObj')");
var settingsObj = JObject.Parse(settingsObjStr);

Console.WriteLine($"STORAGE? {settingsObj.ToString()}");

额外检查点

  • 确认操作的是正确页面:登录后若跳转到新页面,要确保Page对象是新页面的实例,而非原登录页。
  • 检查iframe:如果settingsObj是在iframe中设置的,需先切换到对应iframe再获取:
    var iframe = Page.FrameLocator("#target-iframe");
    var settingsObjStr = await iframe.EvaluateAsync<string>("() => sessionStorage.getItem('settingsObj')");
    

内容的提问来源于stack exchange,提问作者klreeher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:45:37