保持用户登录状态-使用Web驱动程序保存Cookie [英] Keep user logged in - save cookies using web driver

查看:53
本文介绍了保持用户登录状态-使用Web驱动程序保存Cookie的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

This is what I want to perform using WebDriver.

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

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

The problem is when I close the driver and reopen it, I am not signed in.

我的代码看起来像这样-

My code looks like this-

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

推荐答案

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

  1. You can create firefox/another browser profile and use it. All cookies in this case will be saved inside of this profile.

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

you can add hardcoded cookies after browser open. But in this case they will be "static".(the same on every session)

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

If you need to only to do check of login/logout you can save cookies manually to some variables, remove cookies from webdriver, refresh page, add cookies back.

最简单的方法是使用序列化.(为cookie创建自己的类,并将其保存到硬盘或从硬盘加载到硬盘)这是最佳选择! >

Most easy way will be to use serialization. (create own class for cookies and save/load it to/from hdd) This is the best choice!

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

you can write code to save cookies to xml file before browser close and to load on driver start. This is example of realization in C# of such functionality using Linq:

.

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

    }
}

在这种情况下,可以将所有cookie都保存为XML,并通过附加的函数包装器将MyCookie加载到cookie,并在需要时加载cookie.

In this case there is possible to save all cookies in XML and load from MyCookie to Cookie by additional function-wrapper and load cookies when its needed.

通过这种方式,这是cookie XML文件的示例:

By the way this is example of cookies XML file:

<?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配置文件名称

user_name="SomeName" -- is cookie profile name

这篇关于保持用户登录状态-使用Web驱动程序保存Cookie的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆