如何使用并行测试设置关闭Chrome驱动程序并在Selenium C#和SpecFlow中清除内存



当前运行测试时,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(),但这并没有帮助。

  • 色度:85.0.4183.8700
  • 规格流量-3.0.225
  • Selenium网络驱动程序-3.141

由于您已经有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()方法会扼杀这个过程,但最近我不得不添加一些额外的强度清理和错误处理。

最新更新