保持用户登录 - 使用网络驱动程序保存cookie

时间:2015-05-26 14:10:06

标签: java selenium selenium-webdriver webdriver

这是我想要使用 WebDriver 执行的操作。

  1. 使用选中的复选框登录网站,让用户登录。
  2. 关闭浏览器。
  3. 再次访问该网站,确保该用户已登录。
  4. 问题是当我关闭驱动程序并重新打开它时,我没有登录。

    我的代码看起来像这样 -

       WebDriver myD = null;
        myD = new FirefoxDriver();
        String URL = "https://www.eurostylelighting.com/protected/account/signin?ReturnUrl=%2f";
        myD.navigate().to(URL);
        myD.findElement(By.cssSelector("input#txtEmailorRewards")).sendKeys("abc@yahoo.com");           
        myD.findElement(By.cssSelector("input#txtPassword")).sendKeys("abc");
        myD.findElement(By.xpath(".//*[@id='accountSignIn']/dl[4]/dd/label/span")).click();
    Set<Cookie> cookies = myD.manage().getCookies();
        myD.close();
        myD= new FirefoxDriver();
        myD.navigate().to(URL);
    for(Cookie getCookie:cookies)
                myD.manage().addCookie(getCookie);
    

3 个答案:

答案 0 :(得分:5)

  1. 您可以创建firefox /其他浏览器配置文件并使用它。在这种情况下,所有Cookie都将保存在此配置文件中。

  2. 您可以在浏览器打开后添加硬编码的Cookie。但在这种情况下,它们将是“静态的”。(每次会话都是一样的)

  3. 如果您只需要检查登录/注销,您可以手动将cookie保存到某些变量,从webdriver中删除cookie,刷新页面,添加cookie。

  4. 最简单的方法是使用序列化。(为Cookie创建自己的类并将其保存/加载到hdd)这是最好的选择!

  5. 您可以编写代码以在浏览器关闭之前将cookie保存到xml文件并在驱动程序启动时加载。这是使用Linq在C#中实现此类功能的示例:

  6. using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace Ifrit
    {
        public class CookiesManager
        {
            XDocument xmlDoc;
            string xml_path;
    
            public CookiesManager()
            {
                xml_path = ParamsLib.BrwsrOptions.BrowserCookiesFile;
    
                xmlDoc = new XDocument();
    
                if (File.Exists(xml_path))
                {
                    xmlDoc = XDocument.Load(xml_path);
                }
                else
                {
                    var xmlBodyNode = new XElement("body","");
                    var xmlCList = new XElement("cookies_list","");
    
                    xmlBodyNode.Add(xmlCList);
    
                    xmlBodyNode.Save(xml_path);
                    xmlDoc = XDocument.Load(xml_path);
                }
            }
    
            public List<MyCookie> GetCookiesForUser(string user_name)
            {
                List<MyCookie> cookiesList = new List<MyCookie>();
                try
                {
                    cookiesList = (from e in xmlDoc.Root.Elements("cookies_list")
                                   let cookie = e.Element("cookie")
                                   where (string)cookie.Attribute("user_name") == user_name
                                   select new MyCookie
                                   {
                                       name = (string)cookie.Attribute("c_name"),
                                       value = (string)cookie.Attribute("c_value"),
                                       domain = (string)cookie.Attribute("c_domain"),
                                       path = (string)cookie.Attribute("c_path"),
                                       expiries = (string)cookie.Attribute("c_expiries"),
                                       secure = (string)cookie.Attribute("c_secure"),
                                   }).ToList();
                }
                catch 
                { }
    
                return cookiesList;
            }
    
            public void AddCookiesForUser(string username, string cookieName, string cookieValue, string domainName, string path, string expiries, string secure)
            {
                var xmlNode =  new XElement("cookie",   new XAttribute("user_name", username),
                                    new XAttribute("c_name", cookieName),
                                    new XAttribute("c_value", cookieValue),
                                    new XAttribute("c_domain", domainName),
                                    new XAttribute("c_path", path),
                                    new XAttribute("c_expiries", expiries),
                                    new XAttribute("c_secure", secure)
                );
    
                xmlDoc.Element("body").Element("cookies_list").Add(xmlNode);
            }
    
            public void Save()
            {
                xmlDoc.Save(xml_path);
            }
    
            public void removeCookieForUser(string username)
            {
                try
                {
                    xmlDoc.Element("body").Element("cookies_list").Descendants("cookie")
                                       .Where(x => (string)x.Attribute("user_name") == username)
                                       .Remove();
                }
                catch 
                { 
                }
            }
    
    
            public class MyCookie
            {
                public string name { get; set; }
                public string value { get; set; }
                public string domain { get; set; }
                public string path { get; set; }
                public string expiries { get; set; }
                public string secure { get; set; }
            }
    
        }
    }
    

    在这种情况下,可以用XML保存所有cookie,并通过额外的函数包装器从MyCookie加载到Cookie,并在需要时加载cookie。

    顺便说一下这是cookies XML文件的例子:

    <?xml version="1.0" encoding="utf-8"?>
    <body>
      <cookies_list>
        <cookie user_name="SomeName" c_name="6a64d0796e530a04069945d05c4074ca" c_value="yes" c_domain="www.marathonsportsbook.com" c_path="/" c_expiries="17.05.2057 15:41:44" c_secure="True" />
        <cookie user_name="SomeName" c_name="2b132c80be5271bcd9a0dddcc2f12c18" c_value="yes" c_domain="www.marathonsportsbook.com" c_path="/" c_expiries="17.05.2057 15:41:44" c_secure="True" />
        <cookie user_name="SomeName" c_name="PUNTER_KEY" c_value="A81B639C8F69931DAAD24DE4A8972632" c_domain=".marathonsportsbook.com" c_path="/" c_expiries="27.05.2016 15:41:44" c_secure="True" />
        <cookie user_name="SomeName" c_name="JSESSIONID" c_value="web2~F8D01B04BDE8C9702A1795521E06B218" c_domain="www.marathonsportsbook.com" c_path="/" c_expiries="28.05.2015 15:46:16" c_secure="True" />
        <cookie user_name="SomeName" c_name="afterLoginRedirectPath" c_value="&quot;https://www.marathonsportsbook.com/en/&quot;" c_domain="www.marathonsportsbook.com" c_path="/" c_expiries="28.05.2015 15:46:16" c_secure="True" />
      </cookies_list>
    </body>
    

    user_name =“SomeName” - 是Cookie个人资料名称

答案 1 :(得分:2)

是的,您无法添加不属于您正在使用的域的Cookie。正如我在其他答案中提到的,根据域进行过滤并查看cookie是否属于测试域。您可以执行以下操作:

WebDriver myD = null;
myD = new FirefoxDriver();
String URL = "https://www.eurostylelighting.com/protected/account/signin?ReturnUrl=%2f";
myD.navigate().to(URL);
myD.findElement(By.cssSelector("input#txtEmailorRewards")).sendKeys("abc@yahoo.com");           
myD.findElement(By.cssSelector("input#txtPassword")).sendKeys("abc");
myD.findElement(By.xpath(".//*[@id='accountSignIn']/dl[4]/dd/label/span")).click();
Set<Cookie> cookies = myD.manage().getCookies();
myD.close();
myD= new FirefoxDriver();
myD.navigate().to(URL);
for(Cookie getCookie:cookies){
    if(getCookie.domain.equals("Your domain")){
        myD.manage().addCookie(getCookie);
    }
}

注意:您无法将Cookie添加到 localhost 。如果是这种情况,请使用IP或其他内容

答案 2 :(得分:0)

我已经复制了安德鲁的回答,但是GetCookiesForUser方法只从他的例子中返回第一个cookie

<cookie user_name="SomeName" c_name="6a64d0796e530a04069945d05c4074ca"     c_value="yes" c_domain="www.marathonsportsbook.com" c_path="/" c_expiries="17.05.2057 15:41:44" c_secure="True" />

局部变量cookiesList只包含一个元素。

我认为linq查询必须更改为

from e in xmlDoc.Root.Elements("cookies_list")
                              where (string)e.Element("cookie").Attribute("user_name") == user_name
                              from c in e.Elements("cookie")
                              select new MyCookie

主要思想是不通过多个user_names的cookie进行迭代,而是通过一个user_name的单独cookie进行迭代