无法使用C#在Selenium WebDriver中使用现有的Firefox配置文件

时间:2017-10-10 14:54:56

标签: c# selenium firefox asp.net-core asp.net-core-2.0

我需要使用Firefox的共享配置文件,退出时不会删除它。似乎可以使用scrollVIew.contentInset scrollVIew.scrollIndicatorInsets scrollView.contentSizeFirefoxProfile来完成此操作。但它们似乎都不起作用:启动geckodriver时,它使用像这样的临时配置文件

  

1507646897935 mozrunner :: runner INFO运行命令:   " C:\ Program Files \ Mozilla Firefox \ firefox.exe" " -marionette"   " -profile"   " C:\用户\\应用程序数据\本地\ TEMP \ rust_mozprofile.uzI9KAmLQ1zP"

调试时,我注意到配置文件的属性FirefoxOptions始终为空。

ProfileDirectory

配置文件测试是之前使用var profileManager = new FirefoxProfileManager(); var profile = profileManager.GetProfile("Test"); var driver = new FirefoxDriver(profile); 手动创建的。我也尝试使用它的位置:

firefox -p

但同样的问题,无法弄清楚为什么这不起作用。

使用过的软件

  • geckodriver 0.19.0
  • Selenium.Firefox.WebDriver 2.0.0(NuGet)
  • Selenium.WebDriver 3.6.0(NuGet)
  • ASP.NET Core 2.0

2 个答案:

答案 0 :(得分:0)

通过将配置文件的路径作为常规CLI参数传递给Chrome解决了此问题:

var options = new ChromeOptions();
options.AddArgument(@"--user-data-dir=C:\Users\<MyUsername>\TestProfile");
var driver = new ChromeDriver(options);

还应该与Firefox一起使用。但是我需要切换到Chrome,直到FF驱动程序中的另一个错误得到修复。这根本不是一个完整的解决方案,但是它可以作为一种解决方法,直到找到更好的解决方案为止。

答案 1 :(得分:0)

在Firefox中,我需要保留所有cookie,历史记录,缓存等,并且由于硒不是出于明显的原因而无法跨会话保存其中的任何内容,因此无济于事。

由于没有针对Firefox的解决方案,这就是我如何对其进行黑客攻击

  1. 阅读firefox.exe命令行以了解 配置文件的温度目录。
  2. 手动关闭浏览器,以免删除临时配置文件
  3. 在保留所有数据的情况下移动临时配置文件

代码如下:

IWebDriver _driver;
var service = FirefoxDriverService.CreateDefaultService();

//Start webdriver
_driver = new FirefoxDriver(service, options);


//get the webdriver commandline so we can get the path of the ff profile temp dir so we can save it later
var proc = service.ProcessId;
string cmdline = GetCommandLine(proc);
string profilePath = cmdline.Substring(cmdline.IndexOf(" -profile ") + 10);





//Do stuff with your browser




//In order to move the temp profile dir, we have to 'manually' close the browser window.
//There is no other way because the temp profile gets deleted if you use _driver.close()
var ffprocess = Process.GetProcesses().FirstOrDefault(x => x.MainWindowTitle == $"{title} - Mozilla Firefox");
ffprocess.CloseMainWindow();

//Delete the old profile data so we can get the updated data.
Directory.Delete(sProfile, true);

//store the temp profile data
Directory.Move(profilePath, sProfile);
//this must be deleted, othervise the webdriver won't start next time
File.Delete(sProfile + @"\user.js");




string GetCommandLine(int process)
{
    using (ManagementObjectSearcher searcher = new ManagementObjectSearcher($"SELECT CommandLine FROM Win32_Process WHERE CommandLine Like \"% -profile %\" AND ParentProcessID = {process}"))
    using (ManagementObjectCollection objects = searcher.Get())
    {
        return objects.Cast<ManagementBaseObject>().SingleOrDefault()?["CommandLine"]?.ToString();
    }

}