保持用户登录 - 使用网络驱动程序保存 cookie
这就是我想使用 WebDriver 执行的操作.
This is what I want to perform using WebDriver.
- 使用选中的复选框登录网站,让用户保持登录状态.
- 关闭浏览器.
- 再次访问该站点并确保该用户已登录.
问题是当我关闭驱动程序并重新打开它时,我没有登录.
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);
推荐答案
您可以创建 firefox/其他浏览器配置文件并使用它.在这种情况下,所有 cookie 都将保存在此配置文件中.
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=""https://www.marathonsportsbook.com/en/"" 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
相关文章