我的应用程序正在使用selenium来自动化浏览器 - 不是用于测试应用程序,而是实际上是正在运行的应用程序的一部分。
我正在尝试在selenium中加载FF的配置文件,但是当我打开FF版本时它不起作用。我试图用下面的东西解决它。
IEnumerable<int> pidsBefore = Process.GetProcessesByName("firefox").Select(p => p.Id);
FirefoxProfile profile = new FirefoxProfile(pathsToProfiles[0]);
profile.SetPreference("browser.tabs.loadInBackground", false); // set preferences you need
if (pidsBefore.Count() > 0)
{
//this next line is where I need to grab the currently open browser somehow - I know this wont work as it wont bring up the selenium webdriver plugin but ...
driver = new FirefoxDriver((FirefoxBinary)Process.GetProcessById(pidsBefore.Last()), profile, TimeSpan.FromSeconds(30));
}
else
{
driver = new FirefoxDriver(new FirefoxBinary(), profile, TimeSpan.FromSeconds(30));
//this also fails below
// driver = new FirefoxDriver(profile);
// The process cannot access the file 'C:\Users\me\AppData\Roaming\Mozilla\Firefox\Profiles\4xcr92nu.default-1373036135509\parent.lock' because it is being used by another process.
}
IEnumerable<int> pidsAfter = Process.GetProcessesByName("firefox").Select(p => p.Id);
IEnumerable<int> newFirefoxPids = pidsAfter.Except(pidsBefore);
foreach (int pid in newFirefoxPids)
{
Program.newBrowserPid=pid;
//I could kill all open instances here but I dont want to
}
driver.SwitchTo();
我可以关闭现有的FF实例或询问用户是否要关闭浏览器,但这并不理想。
答案 0 :(得分:-1)
创建默认配置文件的副本,然后将您的selenium指向此复制的配置文件是解决此问题的一种方法。这样您就不必杀死其他FF进程。
FirefoxProfile profile = new FirefoxProfile(@"C:\Users\YourName\AppData\Roaming\Mozilla\Firefox\Profiles\CopyOfProfile");
FirefoxDriver driver = new FirefoxDriver(profile);
如果您需要它与原始配置文件保持同步,您可以监视原始目录并将更改复制到副本,或者只运行定期重新复制的计划任务。根据您的自动化程度,保持最新状态可能完全没必要。