gpt4 book ai didi

c# - Selenium FirefoxDriver : Share Session/Cookies between different instances

转载 作者:行者123 更新时间:2023-11-30 20:24:43 25 4
gpt4 key购买 nike

我有以下场景:

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

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

我的工作:

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

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

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

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

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

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

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

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

感谢您的帮助。

最佳答案

首先我认为有一种方法可以在两个实例之间共享配置文件,但 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:Refresh(现在应该已经登录)
  • 司机 2:导航到 SiteB

一个场景。我希望它有效。祝你好运。

关于c# - Selenium FirefoxDriver : Share Session/Cookies between different instances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26118048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com