C#/ASP.NET Selenium WebDriver-重新使用Cookie

C#/ASP.NET Selenium WebDriver-重新使用Cookie,c#,asp.net,cookies,selenium,webdriver,C#,Asp.net,Cookies,Selenium,Webdriver,我想: 登录网站 保存Cookies 让用户选择a、B或C A、 B和C都需要登录 每个人都会打开一个FirefoxDriver并做自己的事情 我要做的是登录一次,从中保存cookies,并将它们添加到我想要打开的任何其他FirefoxDriver中 现在我正试着把饼干存起来 public ReadOnlyCollection<Cookie> Cookies { get; set; } 假设登录成功并且cookies保存在上面,我有: WebDriver = n

我想:

  • 登录网站
  • 保存Cookies
  • 让用户选择a、B或C
  • A、 B和C都需要登录
  • 每个人都会打开一个FirefoxDriver并做自己的事情
我要做的是登录一次,从中保存cookies,并将它们添加到我想要打开的任何其他FirefoxDriver中

现在我正试着把饼干存起来

public ReadOnlyCollection<Cookie> Cookies { get; set; }
假设登录成功并且cookies保存在上面,我有:

        WebDriver = new FirefoxDriver();
        WebDriver.Navigate().GoToUrl("http://www.example.com");

        if (cookies != null)
        {
            var s = WebDriver.Manage().Cookies;  //Logged out cookies
            WebDriver.Manage().Cookies.DeleteAllCookies(); //Delete all of them
            var sd = WebDriver.Manage().Cookies; //Make sure theyre deleted
            foreach (var cookie in cookies)
            {
                WebDriver.Manage().Cookies.AddCookie(cookie);
            }
            var ss = WebDriver.Manage().Cookies; 
            WebDriver.Navigate().GoToUrl("http://example.com/requiresloginpage");
        }
问题是,在这种情况下,如果超过“ss”,就会出现这个异常错误

AllCookies = 'ss.AllCookies' threw an exception of type
'OpenQA.Selenium.WebDriverException'
base {System.Exception} = {"Unexpected problem getting cookies"}
InnerException = {"Cookie name cannot be null or empty string\r\nParameter name: name"}

我传递了8个cookies(当你登录时的总数)-它们似乎都设置好了。不确定我做错了什么

通常,Selenium不支持跨会话Cookie

最简单的方法是使用序列化。 您需要围绕selenium的cookie创建包装类,并使其可序列化。并创建类CookiesManager,其中有两个方法:SaveSession()--保存和RestoreSession()--从序列化文件还原

另一种方法是将一些cookies信息保存到一些临时cookies文件中。喜欢Csv或XML。 您可以在此处看到这种方式的示例:
但仅适用于c#。

为了保存cookies,您应该告诉selenium使用指定的配置文件。由于某些原因,我无法让它使用我的普通Chrome配置文件,但此解决方案将允许您登录一次,之后,selenium将记住cookies

ChromeOptions options = new ChromeOptions();
options.AddArguments(@"user-data-dir=C:\Users\YOU\AppData\Local\Google\Chrome\User Data\NAMEYOUCHOOSE");
//specify location for profile creation/ access
ChromeDriver driver = new ChromeDriver(options);
简单地说,这段代码为配置文件创建了一个保存位置,其中包含cookie。 使用此代码,无需编写保存或加载cookie的代码,Chrome将处理此问题


请注意,chrome保存您的配置文件的位置可能与我的不同,我只成功使用了一个目录,该目录指向与我的常规chrome配置文件相同的位置。此配置文件以文件夹而不是文件的形式存在。

我想您已经检查了
s
的内容了吧?它们包含哪些设置了所有值的Cookie?不确定您的意思,但这里有屏幕截图(允许我们发布图像链接吗?[[未登录(值
s
):[[登录(我正在传递的Cookie)):使用调试器检查每个cookie,它是否有名称和值?是的,我稍后将继续研究:)谢谢!到目前为止,这是最简单的解决方案。是的,它正在工作!:p
ChromeOptions options = new ChromeOptions();
options.AddArguments(@"user-data-dir=C:\Users\YOU\AppData\Local\Google\Chrome\User Data\NAMEYOUCHOOSE");
//specify location for profile creation/ access
ChromeDriver driver = new ChromeDriver(options);