在关闭主应用程序之前,请杀死所有子进程(Selenium和WebDriver进程)

时间:2019-07-18 21:29:46

标签: c# .net selenium selenium-webdriver mono

我正在.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)上无法重现。

感谢您的帮助。

1 个答案:

答案 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
 }