Selenium FirefoxDriver:在不同实例之间共享会话/ Cookie

skh*_*o87 2 c# selenium webdriver selenium-firefoxdriver

我有以下场景:

我有一个C#WPF程序,我尝试同时访问不同的网站并从中收集数据.

网站A(www.example.com)有一个登录表单,登录后会显示一些链接,例如www.example.com?redir=abc

我所做的:

  • 启动FirefoxDriver 1
  • 登录
  • 无限循环:收集所有链接和刷新页面

问题是,我在我的项目中的另一个Thread中运行了另一个FirefoxDriver实例2.

在此实例2中,我访问之前收集的链接并想要打开它们.

问题是,为了访问它们(它们是重定向的),我需要再次登录到网站A.当我登录时,实例1上的会话结束,所以我需要再次登录等等,所以有效地实例正在"窃取"彼此的会话.(我想更多地扩展这个实例3,4 ......所以这会使问题更严重).

显然我的问题是实例1和实例2没有共享同一个会话.

我找到解决问题的可能性:

  • 使用相同的FirefoxProfile:尝试过,不工作,仍然不共享会话
  • 使用一个带有2个窗口/标签的实例并使用Selenium ThreadGuard类从两个线程访问它:看起来非常复杂,因为我需要一直在窗口之间切换
  • 使用Selenium Grid:看起来有点过分,我还不知道这对我来说是否正确

因此,我在问,有人建议我应该如何设计这个?

谢谢您的帮助.

ziy*_*iya 6

首先,我认为有一种方法可以在两个实例之间共享一个配置文件,但WebDriver似乎并非如此.我能够让它工作的唯一方法是将cookie从一个实例复制到另一个实例:

var driver1 = new FirefoxDriver();
driver1.Navigate().GoToUrl("http://www.html-kit.com/tools/cookietester/");
driver1.FindElementByXPath("//input[@value=\"Set Test Cookie\"]").Click();

var driver2 = new FirefoxDriver();
driver2.Navigate().GoToUrl("http://www.html-kit.com/tools/cookietester/");

// Copy cookies from one driver to the other
foreach (Cookie c in driver1.Manage().Cookies.AllCookies)
{
    driver2.Manage().Cookies.AddCookie(new Cookie(c.Name, c.Value, c.Domain.TrimStart('.'), c.Path, c.Expiry));
}

driver2.Navigate().Refresh();
Run Code Online (Sandbox Code Playgroud)

只有我必须解决的问题是,如果您不在同一个域中,WebDriver(或Firefox)不允许您设置cookie.因此需要一些小技巧:转到同一域上的URL并刷新或稍后导航到目标URL.所以在你的情况下:

  • Driver1:导航到SiteA
  • Driver1:登录
  • Driver2:导航到SiteA
  • 将Cookie从Driver1复制到Driver2
  • Driver2:刷新(现在应该登录)
  • Driver2:导航到SiteB

一点情景.我希望它有效.祝好运.