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

Ala*_*tar 6 c# asp.net cookies selenium webdriver

我想要:

  • 登录网站
  • 保存饼干
  • 让用户选择A,B或C.
  • A,B和C都需要登录.
  • 每个人都会打开一个FirefoxDriver并做自己的事情

我想要做的是登录ONCE,从中保存cookie,并将它们添加到我想要打开的任何其他FirefoxDriver.

现在我正在尝试保存cookie

public ReadOnlyCollection<Cookie> Cookies { get; set; }
Run Code Online (Sandbox Code Playgroud)

这是结果

WebDriver.Manage().Cookies.AllCookies;
Run Code Online (Sandbox Code Playgroud)

假设登录工作和cookie保存在上面,我有这个:

        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");
        }
Run Code Online (Sandbox Code Playgroud)

问题是,在这种情况下,超过"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"}
Run Code Online (Sandbox Code Playgroud)

我正在传递8个cookie(当你登录时总数) - 而且所有这些都看似已经设置好了.不知道我做错了什么

SJ1*_*J10 8

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

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);
Run Code Online (Sandbox Code Playgroud)

简而言之,此代码为配置文件创建一个保存位置,其中包含 cookie。使用此代码,无需编写保存或加载 cookie 的代码,Chrome 会处理该问题。

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


And*_*rew 0

一般来说,Selenium 不支持跨会话 cookie。

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

另一种方法是将一些 cookie 信息保存到一些临时 cookie 文件中。就像......CSV 或XML。您可以在此处查看这种方式的示例:保持用户登录 - 使用 Web 驱动程序保存 cookie ,但仅适用于 C#。