无需在场景之间重置驱动程序的并行功能执行?

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

我可以在我的测试套件中使用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,然后执行About页面方案,我想要做的是在帮助页面方案已完成,可以在同一浏览器/ webdriver中导航至登录页面(后台),然后继续测试About页面方案,而无需启动新的浏览器和webdriver。

是否有任何方法可以更改此设置,因此我可以继续使用功能文件中的下一个场景,而无需启动全新的驱动程序?如您所见,我已经尝试检查driver是否为null,但这无法正常工作,因为当它移至功能文件中的下一个场景时,它似乎始终为null。

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

“ System.Reflection.TargetInvocationException:发生了异常由调用的目标抛出。”错误。

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

c# selenium specflow
1个回答
0
投票

这是因为您正在使用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;
    }


}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.