c# - 无需在场景之间重置驱动程序的并行功能执行?
问题描述
我有为我的测试套件工作的 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:调用的目标已引发异常。” 错误。
可能是因为这两个功能都使用同一个步骤文件中的步骤?
解决方案
这是因为您使用的是 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;
}
}
推荐阅读
- django - 创建后如何禁止更改 Django 字段?
- xml - 需要 XSLT 2.0 帮助 - 分组方式、总和、替换字符串
- python - 如何查看列元素是否在后面的行中交换
- angular - 在角度 7 中,如何使用来自对象的数据填充垫表
- elixir - 外协协会
- facebook - Facebook 错误:SERVER_ERROR:[代码] 1675030 [消息]:查询错误。[额外]:空
- jquery - modal.show 上重复出现的 JQuery 帖子
- apache - weblogic & OHS - 如何通过公共外部端口使我的应用程序可用
- ruby - Redmine 未加载;安装的宝石未加载
- react-native - 有什么方法可以拦截 Android 的重新加载事件吗?