Selenium SpecFlow拆卸打开和关闭多个空白浏览器

Selenium SpecFlow拆卸打开和关闭多个空白浏览器,selenium,bdd,specflow,Selenium,Bdd,Specflow,我正在将一堆selenium测试用例转换为SpecFlow。一切都很好,但让我抓狂的是,我正在使用一个后场景来执行driver.quit。当它执行时,我大约有4-6个浏览器打开和关闭。在查看任务管理器时,它正在杀死所有chromedriver.exe(第二个在某处打开)和chrome.exe进程,这非常棒。如果我在selenium中运行相同的测试,我只有一个浏览器,它会关闭。当SpecFlow现在运行时,它基本上会在打开和关闭浏览器时为我的运行增加10-20秒 如果我把浏览器换成Firefox,

我正在将一堆selenium测试用例转换为SpecFlow。一切都很好,但让我抓狂的是,我正在使用一个后场景来执行driver.quit。当它执行时,我大约有4-6个浏览器打开和关闭。在查看任务管理器时,它正在杀死所有chromedriver.exe(第二个在某处打开)和chrome.exe进程,这非常棒。如果我在selenium中运行相同的测试,我只有一个浏览器,它会关闭。当SpecFlow现在运行时,它基本上会在打开和关闭浏览器时为我的运行增加10-20秒

如果我把浏览器换成Firefox,我也会得到同样的结果。一个浏览器打开,完成时,几个空白的firefox浏览器打开和关闭

知道是什么导致了这种行为吗?我到处寻找,除了我,似乎没有人经历过这一切

谢谢你的帮助

    [AfterScenario]
    public void CleanUp()
    {
        if (seleniumDriver != null)
        {
            SeleniumDriver.Dispose();
            seleniumDriver = null;
        }
    }
这是拆卸代码。我将它放在basetestobject类中,它由specflow类继承。我已尝试删除[TestCleanup],但同样的结果也适用

BaseTestObject.cs

    public class BaseTestObject
     {
    private IWebDriver seleniumDriver;
    private IDriver testDriver;

    [TestInitialize]
    public virtual void Setup()
    {
        TestDriver.goToUrl(ConfigProperties.StartUrl);
    }

    [AfterScenario]
    public void ScenarioTearDown()
    {
     TestDriver.Quit();
    }

    [TestCleanup]
    public void CleanUp()
    {
        TestDriver.Quit();

    }


    public IWebDriver SeleniumDriver
    {
        get
        {
            if (seleniumDriver == null)
            {
                seleniumDriver = GetDriver();
            }
            return seleniumDriver;
        }
    }

    public IDriver TestDriver
    {
        get
        {
            if (testDriver == null)
            {
                testDriver = new UiDriver(SeleniumDriver);
            }
            return testDriver;
        }
    }


    public CurrentPageObjectScope On
    {
        get
        {
            return new CurrentPageObjectScope(TestDriver);
        }
    }

    public static String GetTimestamp()
    {
        return DateTime.Now.ToString("yyyyMMddhhmmssfff");
    }

    public static String GetTimestamp2()
    {
        return DateTime.Now.ToString("M/d/yyyy");
    }

    private IWebDriver GetDriver()
    {
        switch (ConfigProperties.Browser.ToLower())
        {
            case "firefox":
                return new FirefoxDriver();
            case "chrome":


                ChromeOptions options = new ChromeOptions();
                ChromeDriverService service =                ChromeDriverService.CreateDefaultService(@"../Chrome/");
                service.SuppressInitialDiagnosticInformation = true;
                service.HideCommandPromptWindow = true;
                options.AddArguments("test-type");
                options.AddArgument("--start-maximized");
                return new ChromeDriver(service, options);



            case "ie":
            case "internetexplorer":

                return new InternetExplorerDriver(@"../IE/");


            default:
                throw new NotImplementedException("Unknown browser string in Config properties " + ConfigProperties.Browser);
        }


    }
编辑9.15.14

通过在我的baseTestObject中添加以下内容解决。谢谢你的帮助

    [AfterScenario]
    public void CleanUp()
    {
        if (seleniumDriver != null)
        {
            SeleniumDriver.Dispose();
            seleniumDriver = null;
        }
    }

我们最终做了中描述的事情。它允许在场景之间重复使用浏览器(如果您愿意),并仅在“AfterFeature”(场景运行后除外)关闭所有内容。

我也发现打开/关闭浏览器在时间上非常昂贵。在我正在进行的项目中,我们不会关闭浏览器,而是重复使用它,例如,一旦场景完成,导航到不同的起点,或者进行完全刷新。谢谢Ben。不错的选择。奇怪的是,我在运行基本的google测试时没有看到这种行为。我认为这是我的框架,但常规的selenium测试马上就要结束了。我实际上禁用了afterscenario,所以现在我手动关闭它。如果我运行整个套件,我会启用afterscenario并让它关闭它。这不是一个很好的解决办法。你能在问题中包括你的赛后代码吗?如果您也在使用BeforeCasenario钩子代码,请将其包括在内。谢谢你的帮助,本。你还有“TestDriver.Quit();”的代码吗?这是你写的吗?正如Sam建议的答案中所提到的,如果在每个场景结束后都关闭浏览器,则不需要TestCleanup。该链接现在已失效。@BenPower它似乎对我来说工作正常@Sirk这很奇怪,我还是看不到,我只看到一个图标,上面有两个齿轮在旋转。这也许是一个地区性问题?