首页 > 解决方案 > 在关闭主应用程序之前杀死所有子进程(Selenium 和 WebDriver 进程)

问题描述

我在我的 .NET 应用程序中使用 Selenium,在 Firefox 或 Chrome 驱动程序上使用 quit() 时,浏览器进程无法正确关闭,但 WebDriver 进程已关闭。因此,当我的应用程序终止时,剩余的 Firefox 和 Chrome 进程仍然在后台打开(作为我的应用程序的子进程)。

Firefox Driver Running 正常运行时的屏幕截图

尝试使用 quit() 并关闭我的应用程序后

我正在寻找一种方法来关闭 WebDriver 和浏览器进程(不使用懒惰的“杀死所有名为 'chrome' 或 'firefox' 的进程”),如果这是不可能的,那么一种终止所有子进程的方法退出时与我的应用程序相关联的应用程序也适用于我。

当前可用的解决方案使用 ManagementObjectSearcher,但这并不理想,因为它不适用于 Linux (Mono),而只能在 Windows 上使用。

由于我使用的是连接到 DriverService 的 RemoteDriver,因此在处理 DriverService 之前,我在 RemoteDriver 上使用了 quit()。

我希望在我使用 quit() 时关闭所有浏览器进程,包括 WebDrivers,或者至少有一个解决方案可以在退出应用程序之前终止与我的应用程序关联的所有子进程。但只有网络驱动程序被关闭,浏览器进程在后台保持打开状态。

Chrome 不在无头模式下时,实际上会关闭窗口,但进程仍处于打开状态。

Firefox 不在无头模式下时,根本不会关闭窗口。即使使用 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 时遇到的问题不同。经过更多搜索后,我发现其他人也遇到了同样的问题,看到这个问题,它似乎要么是与 Windows 更新或 WebDrivers 相关的问题(我正在使用可用且稳定的最新驱动程序)但是这个问题已经有一段时间没有被打开或提及。

总之,这个问题只在 Windows 上,更具体地说是在 Windows 10 上。这个问题仍然没有解决方案,而且它超出了 Selenium 的范围,更多的是 WebDriver 问题。仍然。


更新

这也是Opera 上的一个问题,正如我上面提到的,一个理想的解决方法是杀死与您的进程关联的所有子进程。对于那些一直说“在退出前使用关闭”不是解决方案的人,因为我不止一次解释了我已经尝试过的内容以及意外的结果是什么

我上面提到的解决方案可以使用“ManagementObjectSearcher”来完成,但是自从我发表这篇文章后,我了解到这个问题只能在 Windows 上重现,并且您的代码、Selenium 以及更多与 WebDriver 或浏览器本身有关的问题都无法解决。因此,如果您在 Windows 上运行,解决方案是仅使用 ManagementObjectSearcher 来杀死与您的进程关联的子进程,因为这在 Mono 上不起作用。但是你不必担心,因为我已经解释过这个问题在 Linux 上是不可重现的,只有在 Windows 上。

谢谢您的帮助。

标签: c#.netseleniumselenium-webdrivermono

解决方案


这就是我使用的。在驱动程序崩溃(它是 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
 }

推荐阅读