2

我有以下情况:

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

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

我所做的:

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

问题是,我有另一个 FirefoxDriver 实例 2 在我的项目的不同线程中运行。

在这个实例 2 中,我访问了我之前收集的链接并想要打开它们。

问题是,为了访问它们(它们正在重定向),我需要再次登录到网站 A。当我登录时,实例 1 上的会话结束,所以我需要再次登录等等等等,所以有效实例正在“窃取”彼此的会话。(我想进一步扩展它以拥有实例 3,4 ......这样会使问题变得更糟)。

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

我发现解决问题的可能性:

  • 使用相同的 FirefoxProfile :尝试,不工作,仍然不共享会话
  • 使用带有 2 个窗口/选项卡的一个实例,并使用 Selenium ThreadGuard 类从两个线程访问它:似乎非常复杂,因为我需要一直在窗口之间切换
  • 使用 Selenium Grid:似乎有点矫枉过正,我还不知道这是否适合我

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

谢谢您的帮助。

4

1 回答 1

8

首先,我认为有一种方法可以在两个实例之间共享配置文件,但 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。所以在你的情况下:

  • 驱动程序 1:导航到站点 A
  • 驱动程序1:登录
  • 驱动程序 2:导航到站点 A
  • 将 cookie 从 Driver1 复制到 Driver2
  • Driver2:刷新(现在应该登录)
  • 驱动程序 2:导航到站点 B

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

于 2014-10-05T23:21:06.273 回答