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

时间:2014-09-30 10:03:43

标签: 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:看起来有些过分,我还无法弄清楚这对我来说是否合适

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

首先,我认为有一种方法可以在两个实例之间共享一个配置文件,但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();

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

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

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