首页 > 解决方案 > 无需在场景之间重置驱动程序的并行功能执行?

问题描述

我有为我的测试套件工作的 specflow 并行功能执行,但目前,它将为该功能中的每个场景打开一个全新的浏览器。有没有办法让它不这样做?因为当我们有数百个场景时,必须为每个场景重新启动浏览器将占用大量额外时间。我想要的只是让浏览器保持打开状态,这样我就可以导航到下一个场景需要去的任何地方,但现在它每次都启动一个全新的驱动程序。

这是钩子类:

    [Binding]
    public class Hook
    {

        private readonly IObjectContainer _container;
        private IWebDriver _driver;
        public Hook(IObjectContainer container)
        {
            _container = container;
        }

        [BeforeScenario]
        private void SetupTest()
        {
            if (_driver == null)
            {
                _driver = new ChromeDriver();
            }
            _container.RegisterInstanceAs<IWebDriver>(_driver);
        }

 ....
    }

这是我的阶梯课:

[Binding]
public class TestSteps
{

    private IWebDriver _driver;

    public TestSteps(IWebDriver driver)
    {
        _driver = driver;
    }

....
}

这是一个示例功能文件:

Feature: Test1

Background:
    Given User is at login page

Scenario: HelpPage
    Given page is loaded
    When user clicks on help
    Then user should be taken to help page

Scenario: AboutPage
    Given page is loaded
    When user clicks on about
    Then user should be taken to about page


Feature: Test2

Background:
    Given User is at login page

Scenario: Welcome
    When the page is loaded
    Then should see welcome message

所以基本上现在test1和test2可以并行运行,但是对于test1,在帮助页面场景完成后,它会启动一个新的webdriver然后做关于页面的场景,我想要它做的是在帮助页面之后场景完成后,让它导航到同一个浏览器/webdriver 中的登录页面(背景),然后继续测试 about page 场景,所有这些都无需启动新的浏览器和 webdriver。

有什么办法可以改变它,这样我就可以继续我的功能文件中的下一个场景,而无需启动一个全新的驱动程序?如您所见,我尝试检查驱动程序是否为空,但这不起作用,因为当它移动到功能文件中的下一个场景时,它似乎总是为空。

编辑:我还尝试通过 AfterScenario 中的功能上下文键设置驱动程序,并将其设置在 beforescenario 中,这可以让一个场景在另一个场景之后运行,但是当我并行运行两个功能时,我现在会得到一个

“System.Reflection.TargetInvocationException:调用的目标已引发异常。” 错误。

可能是因为这两个功能都使用同一个步骤文件中的步骤?

标签: c#seleniumspecflow

解决方案


这是因为您使用的是 IObjectContainer。

对象的生命周期仅限于场景的执行。

参考:https ://github.com/techtalk/SpecFlow/wiki/Context-Injection

场景执行完成后,specflow 将处理对象。

解决方案

您可以创建一个类似于 DriverContext 的类并创建一个方法来初始化您的驱动程序,然后在[BeforeScenario]

[Binding]
    public class Hook
    {

        private DriverContext _driverContext;            
        public Hook(DriverContext driverContext)
        {
            _driverContext= driverContext;
        }

        [BeforeScenario]
        private void SetupTest()
        {
            if (_driverContext.Driver == null)
            {
                _driverContext.StartDriver();
            }               
        }

 ....
    }

DriverContext 类

 public class DriverContext {

      public WebDriver Driver { get; set; }
      public DriverContext ()
        {

        }

    public void StartDriver()
    {
       Driver=new ChromeDriver();
    }
....
}

你的阶梯班

[Binding]
public class TestSteps
{

    private DriverContext _driverContext;

    public TestSteps(DriverContext driverContext)
    {
        _driverContext= driverContext;
    }


}

推荐阅读