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

问题描述 投票:0回答:2

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

  • Chrome版本:85.0.4183.8700
  • Specflow - 3.0.225
  • 硒网络驱动程序 - 3.141
c# selenium selenium-webdriver specflow
2个回答
1
投票

由于您已经有可用的 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()
方法会终止该进程,但最近我不得不添加一些额外的强力清理和错误处理。


0
投票

我知道这已经很旧了,但如果其他人遇到类似的问题,我会解决它。

我的用途是通过 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。

© www.soinside.com 2019 - 2024. All rights reserved.