我可以在我的测试套件中使用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:发生了异常由调用的目标抛出。”错误。
可能是因为两个功能都使用同一步骤文件中的步骤?
这是因为您正在使用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;
}
}