这是我想要使用 WebDriver 执行的操作。
问题是当我关闭驱动程序并重新打开它时,我没有登录。
我的代码看起来像这样 -
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);
答案 0 :(得分:5)
您可以创建firefox /其他浏览器配置文件并使用它。在这种情况下,所有Cookie都将保存在此配置文件中。
您可以在浏览器打开后添加硬编码的Cookie。但在这种情况下,它们将是“静态的”。(每次会话都是一样的)
如果您只需要检查登录/注销,您可以手动将cookie保存到某些变量,从webdriver中删除cookie,刷新页面,添加cookie。
最简单的方法是使用序列化。(为Cookie创建自己的类并将其保存/加载到hdd)这是最好的选择!
您可以编写代码以在浏览器关闭之前将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; }
}
}
}
在这种情况下,可以用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=""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个人资料名称
答案 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进行迭代