我正在.NET应用程序中使用Selenium,在Firefox或Chrome驱动程序上使用quit()时,浏览器进程无法正确关闭,但是WebDriver进程已关闭。因此,当我的应用程序终止时,其余的Firefox和Chrome进程将在后台保持打开状态(作为我的应用程序的子进程)。
Screenshot when running normally with Firefox Driver Running
After trying to using quit() and closing my application
我正在寻找一种关闭WebDriver的方法,并且浏览器使用它来关闭进程(不使用懒惰的“杀死所有名为'chrome'或'firefox'的进程”),如果无法实现,那么一种终止方法退出应用程序时,与我的应用程序关联的所有子进程也将对我有用。
当前可用的解决方案使用了ManagementObjectSearcher,但这并不是理想的,因为它不适用于Linux(Mono),而仅适用于Windows。
我尝试在使用quit()之前使用close()关闭所有Windows,但浏览器进程仍然保持打开状态
我试图调试语句,以查看它是否实际上是向Web驱动程序发送了退出命令。
由于我正在使用连接到DriverService的RemoteDriver,因此在处置DriverService之前,我正在使用RemoteDriver上的quit()。
我希望当我使用quit()时,包括WebDrivers在内的所有浏览器进程都将关闭,或者至少有一种解决方案,可以在退出应用程序之前终止与我的应用程序关联的所有子进程。但是只有Web驱动程序会关闭,浏览器进程仍会在后台打开。
Chrome在不采用无头模式时,实际上会关闭Window,但进程仍保持打开状态。
Firefox不在无头模式时,根本不会关闭Window。即使使用close()
示例代码
// Creating the RemoteDriver with Options
var DriverService = ChromeDriverService.CreateDefaultService();
var DriverOptions = new ChromeOptions();
DriverOptions.AddArgument("headless");
DriverOptions.AddArgument("mute-audio");
DriverService.Start();
var RemoteDriver = new RemoteWebDriver(DriverService.ServiceUrl, DriverOptions);
// Quitting
RemoteDriver.Quit();
DriverService.Dispose();
更新
在Linux上测试了相同的代码之后,浏览器进程已按预期方式关闭,这与我使用Windows 10时遇到的问题不同。经过进一步的搜索,我发现其他人也遇到了相同的问题see this issue和似乎是与Windows更新或WebDrivers有关的问题(我使用的是可用且稳定的最新驱动程序)。但是此问题有一段时间未公开或提及。
总而言之,此问题仅存在于Windows上,更确切地说是在Windows 10上。此问题仍然没有解决方案,这超出了Selenium的范围,甚至超出了WebDriver问题。还是。
更新
在Opera上也This is an issue,如上所述,一个理想的解决方法是杀死与您的进程关联的所有子进程。 对于那些一直说“退出前请先使用CLOSE”的人来说,这不是一个解决方案,因为我不止一次地解释了我已经尝试过的东西以及意外结果是什么
我上面提到的解决方案可以通过“ ManagementObjectSearcher”完成,但是自从我发表这篇文章以来,我了解到此问题仅在Windows上可重现,而您的代码,Selenium以及其他与WebDriver或其他问题无关的问题浏览器本身。因此,解决方案是仅在Windows上运行时才使用ManagementObjectSearcher杀死与您的进程关联的子进程,因为这在Mono上不起作用。但是您不必担心,因为我已经解释了这个问题在Linux(仅Windows)上无法重现。
感谢您的帮助。
答案 0 :(得分:0)
这就是我用的。如果驱动程序崩溃了(这是Java),则无济于事:
boolean closecaught = false;
try
{
if (driver!=null) { driver.close(); }
}
catch (Exception e)
{
closecaught = true;
System.out.println(e.toString());
try {
driver.quit();
}
catch (Exception exce)
{
System.out.println("Exception quitting" + exce.toString());
}
}
if (closecaught)
{
}
else
{
try
{
driver.quit();
}
catch (Exception ex)
{
// don't worry it should close
}