【问题标题】:SpecFlow Teardown Opens and Closes Multiple Blank BrowsersSpecFlow Teardown 打开和关闭多个空白浏览器
【发布时间】:2014-09-16 04:26:03
【问题描述】:

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

如果我将浏览器更改为 Firefox,我会得到同样的结果。一个浏览器打开,完成后,几个空白的 firefox 浏览器打开和关闭。

任何想法可能导致这种行为?我已经搜索过,除了我之外,似乎没有人经历过这种情况。

感谢您的帮助。

这里是拆解代码。我在 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;
        }
    }

【问题讨论】:

  • 我也发现打开/关闭浏览器的时间成本很高。在我正在处理的项目中,我们不会杀死浏览器,我们会重复使用它,例如场景完成或完全刷新后导航到不同的起点。
  • 谢谢本。不错的选择。奇怪的是,当我运行基本的谷歌测试时,我没有看到这种行为。我认为这是我的框架,但定期硒测试会立即关闭。我实际上禁用了 afterscenario 所以现在我手动关闭它。如果我运行整个套件,我会启用 afterscenario 并让它关闭它。不是一个很好的解决方法。
  • 您能否在问题中包含您的 AfterScenario 代码?如果你也在使用它,还包括你的 BeforeScenario 钩子代码。
  • 已添加到初始帖子中。感谢本的帮助。
  • 你是否也得到了“TestDriver.Quit();”的代码那是你写的吗?正如 Sam 的建议答案中所提到的,如果您在每个场景之后都关闭浏览器,则不需要 TestCleanup。

标签: selenium bdd specflow


【解决方案1】:

我们最终做了this post 中描述的事情。它允许浏览器在场景之间重用(如果需要)并仅在“AfterFeature”(而不是在场景运行后)关闭所有内容。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 2021-11-19
  • 2017-04-04
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多