当前运行测试时,Chrome 驱动程序会堆积起来并且从未完全关闭。
尝试过使用:
driver.Close();
driver.Quit();
driver.Dispose();
与此相关讨论
但是在测试运行/完成后,Chrome 驱动程序似乎仍然存在。
场景挂钩后:
[AfterScenario]
public void AfterScenario()
{
var driver = _objectContainer.Resolve<IWebDriver>();
driver?.Quit();
driver?.Dispose();
}
功能挂钩后:
[AfterFeature]
public static void AfterFeature(FeatureContext featureContext)
{
var driverService = featureContext.Get<ChromeDriverService>();
driverService.Dispose();
}
当前正在并行运行 4 个测试,因此希望避免意外关闭所有浏览器。
已确认场景结束时会调用
AfterScenario
,但它们似乎仍然潜伏在本地,当它们堆积时会减慢我的机器速度。如前所述,我已经尝试过driver.Close()
,但这没有帮助。
由于您已经有可用的 ChromeDriverService,因此请在
[AfterScenario]
挂钩中显式终止该进程:
[AfterScenario]
public void AfterScenario()
{
// Add a FeatureContext parameter to the class constructor if need be
var driverService = featureContext.Get<ChromeDriverService>();
var driver = _objectContainer.Resolve<IWebDriver>();
try
{
if (driverService.ProcessId != default)
{
Trace.WriteLine("Attempting to kill web driver service process #" + driverService.ProcessId);
var process = Process.GetByProcessId(driverService.ProcessId);
process.Kill();
Trace.WriteLine(" > Done killing process #" + driverService.ProcessId);
}
}
catch (Exception ex)
{
Trace.WriteLine("Exception thrown when killing web driver service: " + ex);
}
try
{
driverService.Dispose();
Trace.WriteLine("Web driver service disposed of.");
}
catch (Exception ex)
{
Trace.WriteLine("Exception thrown when disposing of web driver service: " + ex);
}
driver?.Close();
driver?.Quit();
driver?.Dispose();
}
自 Chrome 85 起,我注意到这些 ChromeDriver.exe 进程不再像以前那样容易清理。您可能会认为
Dispose()
方法会终止该进程,但最近我不得不添加一些额外的强力清理和错误处理。
我知道这已经很旧了,但如果其他人遇到类似的问题,我会解决它。
我的用途是通过 CTRL+单击测试中的链接来打开另一个选项卡。当 ChromeDriver 运行 Close 和 Dispose 时,ChromeDriver WindowHandle 未正确关闭。
我的解决方案是在终止和处置 ChromeDriver 进程之前关闭所有窗口句柄,如下所示:
[AfterScenario]
public void Dispose()
{
// Wrap in a try catch, once there are no more WindowHandles, trying to access the collection throws an exception
try
{
while (_context.Driver.WindowHandles.Count > 0)
{
_context.Driver.SwitchTo().Window(_context.Driver.WindowHandles[0]);
_context.Driver.Close();
}
}
catch (Exception) { }
_context.Driver.Quit();
}
在.Quit之后调用.Dispose应该是多余的。退出应该关闭浏览器并处置驱动程序实例。
这捕获了额外的 chrome.exe 进程,这些进程突然出现并耗尽了我所有的 CPU。