使用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
相关产品推荐
相关产品推荐

