如何使用Selenium和C#将Cookie保存为字符串?

7gyucuyw  于 2022-12-13  发布在  C#
关注(0)|答案(1)|浏览(365)

到目前为止,我实现了获得一个网站的所有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保存为字符串,因为这是我的项目的要求。

7cwmlq89

7cwmlq891#

即使这个问题有点不清楚,我也会尽力给予你一个解决问题的办法。
如果理解正确,您需要将OpenQA.Selenium.Cookie转换为string,这样您就可以将检索到的cookie序列化为一个json字符串,并将此json存储到一个变量中以供以后使用。现在,如果您想将此(cookie的)字符串设置为新的cookie,您必须将其反序列化回OpenQA.Selenium.Cookie
为此,我创建了两个扩展方法,使代码更简洁。

public static class Extensions
{
    public static string GetCookiesAsString(this IWebDriver driver)
    {
        var cookies = driver.Manage().Cookies.AllCookies;
        return System.Text.Json.JsonSerializer.Serialize(cookies, new JsonSerializerOptions { WriteIndented = true });
    }

    public static void SetCookies(this IWebDriver driver, string json)
    {
        var cookies = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json)!;
        foreach (var c in cookies)
        {
            string name = c.Name;
            string value = c.Value;
            string domain = c.Domain;
            string path = c.Path;
            DateTime? expiry = c.Expiry;
            bool secure = c.Secure;
            bool isHttpOnly = c.IsHttpOnly;
            string sameSite = c.SameSite;

            var cookie = new Cookie(name, value, domain, path, expiry, secure, isHttpOnly, sameSite);

            driver.Manage().Cookies.AddCookie(cookie);
        }
    }
}

您可以使用以下这些方法:

using OpenQA.Selenium.Chrome;

var options = new ChromeOptions();
options.AddArguments( "--headless");
using var driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("https://stackoverflow.com/");

var initialCookies = driver.GetCookiesAsString();
Console.WriteLine(initialCookies);

driver.Manage().Cookies.DeleteAllCookies();

Console.WriteLine($"Cookies exist: {driver.Manage().Cookies.AllCookies.Any()}");

driver.SetCookies(initialCookies);

var modifiedCookies = driver.GetCookiesAsString();
Console.WriteLine(modifiedCookies);

相关问题