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

For*_*ing 3 java selenium webdriver selenium-webdriver

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

  1. 使用选中的复选框登录该站点,保持用户登录.
  2. 关闭浏览器.
  3. 再次访问该站点并确保该用户已登录.

问题是当我关闭驱动程序并重新打开它时,我没有登录.

我的代码看起来像这样 -

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

And*_*rew 5

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

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

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

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

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

.

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; }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,可以用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>
Run Code Online (Sandbox Code Playgroud)

user_name ="SomeName" - 是cookie配置文件名称