c# - 在关闭主应用程序之前杀死所有子进程(Selenium 和 WebDriver 进程)
问题描述
我在我的 .NET 应用程序中使用 Selenium,在 Firefox 或 Chrome 驱动程序上使用 quit() 时,浏览器进程无法正确关闭,但 WebDriver 进程已关闭。因此,当我的应用程序终止时,剩余的 Firefox 和 Chrome 进程仍然在后台打开(作为我的应用程序的子进程)。
Firefox Driver Running 正常运行时的屏幕截图
我正在寻找一种方法来关闭 WebDriver 和浏览器进程(不使用懒惰的“杀死所有名为 'chrome' 或 'firefox' 的进程”),如果这是不可能的,那么一种终止所有子进程的方法退出时与我的应用程序相关联的应用程序也适用于我。
当前可用的解决方案使用 ManagementObjectSearcher,但这并不理想,因为它不适用于 Linux (Mono),而只能在 Windows 上使用。
在使用 quit() 之前,我尝试使用 close() 关闭所有 Windows,但浏览器进程仍保持打开状态
我试图调试这些语句以查看它是否实际上正在向 Web 驱动程序发送退出命令,并且确实如此。
由于我使用的是连接到 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 上。
谢谢您的帮助。
解决方案
这就是我使用的。在驱动程序崩溃(它是 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
}
推荐阅读
- swift - 快速解码对象数组
- python - 循环时将数据框的每一列保存在新的数据框中
- javascript - 如何使用 styled-components 更改其他组件中单个组件的样式?
- javascript - 结果低于输入
- javascript - 仅从 Web 应用程序和 localhost 访问 s3 文件
- python - 为什么将列类型更改为数字后仍然是“对象”?
- vue.js - 根据外部 v-for 的属性设置选项的选定属性
- python - Python Pandas:对目录中的每个文件进行循环
- r - ggplot2:调整文本和轴之间的距离
- jquery - 如何在导航项上添加引导 4 活动类?