Kyllian Lissens
Kyllian Lissens

Reputation: 25

Copying Selenium Cookies to CookieContainer

I tried:

foreach (OpenQA.Selenium.Cookie cook in driver.Manage().Cookies.AllCookies)
{
    System.Net.Cookie cookie = new System.Net.Cookie();
    cookie.Name = cook.Name;
    cookie.Value = cook.Value;
    cookie.Domain = cook.Domain;
    header.Add(cookie);
}

But it gave me a NullReference at header.Add(cookie);

I'm trying to get the cookies of my Selenium driver to a CookieContainer to use in a WebRequest.

Upvotes: 0

Views: 3704

Answers (2)

Gregory Liénard
Gregory Liénard

Reputation: 1741

Loop through the selenium cookies in the web driver and convert them to System.Net cookies:

    var cookieContainer = new CookieContainer();
    foreach (var cookie in driver.Manage().Cookies.AllCookies)
    {
        System.Net.Cookie netcookie = new System.Net.Cookie()
        {
            Domain = cookie.Domain,
            HttpOnly = cookie.IsHttpOnly,
            Name = cookie.Name,
            Path = cookie.Path,
            Secure = cookie.Secure,
            Value = cookie.Value,
        };
        if (cookie.Expiry.HasValue)
            netcookie.Expires = cookie.Expiry.Value;
        cookieContainer.Add(netcookie);
    }

Upvotes: 2

user890332
user890332

Reputation: 1361

This is how you do it.

   WebClientEx myWebClient = new WebClientEx(new CookieContainer());
   CookieCollection cc = new CookieCollection();
   foreach (OpenQA.Selenium.Cookie cook in driver.Manage().Cookies.AllCookies)
   {
        System.Net.Cookie cookie = new System.Net.Cookie();
        cookie.Name = cook.Name;
        cookie.Value = cook.Value;
        cookie.Domain = cook.Domain;
        cc.Add(cookie);
   }
   myWebClient.CookieContainer.Add(cc);

You need to use this extension to webclient:

public class WebClientEx : WebClient
{
    public WebClientEx(CookieContainer container)
    {
        this.container = container;
    }

    public CookieContainer CookieContainer
    {
        get { return container; }
        set { container = value; }
    }

    private CookieContainer container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest r = base.GetWebRequest(address);
        var request = r as HttpWebRequest;
        if (request != null)
        {
            request.CookieContainer = container;
        }
        return r;
    }

    protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
    {
        WebResponse response = base.GetWebResponse(request, result);
        ReadCookies(response);
        return response;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        ReadCookies(response);
        return response;
    }

    private void ReadCookies(WebResponse r)
    {
        var response = r as HttpWebResponse;
        if (response != null)
        {
            CookieCollection cookies = response.Cookies;
            container.Add(cookies);
        }
    }
}

The extension I found here: Using CookieContainer with WebClient class

Upvotes: 1

Related Questions