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

Keep user logged in - save cookies using web driver(保持用户登录 - 使用网络驱动程序保存 cookie)
本文介绍了保持用户登录 - 使用网络驱动程序保存 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

这篇关于保持用户登录 - 使用网络驱动程序保存 cookie的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How can create a producer using Spring Cloud Kafka Stream 3.1(如何使用Spring Cloud Kafka Stream 3.1创建制片人)
Insert a position in a linked list Java(在链接列表中插入位置Java)
Did I write this constructor properly?(我是否正确地编写了这个构造函数?)
Head value set to null but tail value still gets displayed(Head值设置为空,但仍显示Tail值)
printing nodes from a singly-linked list(打印单链接列表中的节点)
Control namespace prefixes in web services?(控制Web服务中的命名空间前缀?)