如何使用Selenium和C#将Cookie保存为字符串?
问题
我原本通过以下代码获取网站全部Cookie并保存到文件:
var cookies = driver.Manage().Cookies.AllCookies; // write full path txt file using (StreamWriter fs = new StreamWriter(@"demo.txt", true)) { foreach (var cookie in cookies) { fs.WriteLine(cookie.ToString()); } }
但尝试用以下代码读取文件内容并添加Cookie时无法正常工作:
var lines = File.ReadAllLines(@"C:\Users\flame\Desktop\demo.txt"); foreach (var line in lines) { driver.Manage().Cookies.AddCookie(line); MessageBox.Show(line.ToString()); }
我的真实需求是:不将Cookie保存到文件,而是把目标网站的全部Cookie转为单个字符串,再通过该字符串批量添加所有Cookie,且不能使用data-dir方案。
解决方案
直接使用Cookie.ToString()得到的字符串无法被Selenium的AddCookie方法解析,因为它只是Cookie的简单字符串表示,不是可反序列化的结构化数据。正确的做法是将Cookie序列化为JSON格式的字符串,恢复时再反序列化回Cookie对象批量添加。
1. 将所有Cookie序列化为单个字符串
使用Newtonsoft.Json(需安装对应NuGet包)序列化Cookie集合:
using Newtonsoft.Json; using OpenQA.Selenium; // 获取当前网站所有Cookie var cookies = driver.Manage().Cookies.AllCookies; // 序列化为单个JSON字符串 string cookieString = JsonConvert.SerializeObject(cookies);
如果使用.NET Core/.NET 5+,也可以用内置的System.Text.Json替代:
using System.Text.Json; string cookieString = JsonSerializer.Serialize(cookies);
2. 从字符串批量恢复并添加Cookie
将保存的字符串反序列化为Cookie集合,再逐个添加:
using Newtonsoft.Json; using OpenQA.Selenium; // 假设cookieString是之前保存的Cookie序列化字符串 var cookies = JsonConvert.DeserializeObject<List<Cookie>>(cookieString); // 必须先访问目标网站的域名(Selenium不允许跨域添加Cookie) driver.Navigate().GoToUrl("https://你的目标网站域名.com"); // 批量添加所有Cookie foreach (var cookie in cookies) { driver.Manage().Cookies.AddCookie(cookie); } // 刷新页面使Cookie生效 driver.Navigate().Refresh();
对应System.Text.Json的反序列化代码:
using System.Text.Json; var cookies = JsonSerializer.Deserialize<List<Cookie>>(cookieString);
注意事项
- 添加Cookie前必须先访问目标网站的域名,否则Selenium会抛出跨域错误
- 序列化会完整保留Cookie的所有属性(名称、值、域名、路径、过期时间等),确保恢复后的Cookie和原Cookie一致
- 若使用Newtonsoft.Json,需在项目中安装
Newtonsoft.JsonNuGet包;若用System.Text.Json,无需额外安装(.NET Core 3.0+内置)
内容的提问来源于stack exchange,提问作者xcvvbfbfbb
相关产品推荐
相关产品推荐

