我正在实施框架,这是Specflow中的一个新功能。当我创建一个具有多个场景的功能文件并执行测试时,它会打开一个浏览器实例并运行成功。当我添加一个具有多个场景的功能文件并执行测试时,它会启动多个浏览器实例。告诉我我的代码有什么问题
Start.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TechTalk.SpecFlow;
namespace Orange_HRM
{
class Start : SeleniumDriver
{
[BeforeScenarioBlock]
public void Setup()
{
Intitialize();
WebDriver.Navigate().GoToUrl(BaseAddress);
}
[AfterScenarioBlock]
public void TearDown()
{
Close();
}
}
}
SeleniumDriver.cs
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Orange_HRM
{
class SeleniumDriver
{
public static IWebDriver WebDriver;
public static string BaseAddress
{
get { return Constants.Url; }
}
public static void Intitialize()
{
WebDriver = new ChromeDriver();
WebDriver.Manage().Window.Maximize();
TurnOnWait();
}
public static void Navigate()
{
WebDriver.Navigate().GoToUrl(BaseAddress);
}
public static void Close()
{
WebDriver.Close();
}
public static void Quit()
{
WebDriver.Quit();
}
private static void TurnOnWait()
{
WebDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
WebDriver.Manage().Timeouts().PageLoad = TimeSpan.FromMinutes(2);
}
}
}
答案 0 :(得分:0)
您正在使用techtalk的SpecFlow。
概念名称是“挂钩”。
在特定的时间执行自动逻辑运算。因此,挂钩是事件绑定。
使用SpecFlow + Runner在多个线程中运行测试。
因此,您可以下订单,
class Start : SeleniumDriver
{
[BeforeScenario(Order = 0)]
public void Setup()
{
Intitialize();
WebDriver.Navigate().GoToUrl(BaseAddress);
}
[BeforeScenario(Order = 1)]
public void TearDown()
{
Close();
}
}
我建议您不要使用它们,没有钩子的Bindings Class。 即[BeforeTestRun] [AfterTestRun]改用它们。
[AfterScenario]
public void CleanUp()
{
if (seleniumDriver != null)
{
SeleniumDriver.Dispose();
seleniumDriver = null;
}
}
答案 1 :(得分:0)
您可以在“测试运行”级别而不是方案级别初始化并关闭驱动程序。并仅在方案级别维护URL导航。这样,驱动程序将在测试开始之前启动,并在测试完成后退出。另外,在每种情况下运行之前,页面都会刷新。
namespace Orange_HRM
{
class Start : SeleniumDriver
{
[BeforeTestRun]
public static void Setup()
{
Intitialize();
}
[AfterTestRun]
public static void TearDown()
{
Quit();
}
[AfterScenarioBlock]
public void navigateToUrl()
{
WebDriver.Navigate().GoToUrl(BaseAddress);
}
}
}
您还使用了WebDriver.Close()而不是WebDriver.Quit()。如果我们在主窗口中使用WebDriver.Close(),则会话将终止。然后,如果我们尝试再次访问同一webdriver对象,它将不会引发此类会话错误。
WebDriver.Close()用于关闭子窗口(如果我们使用多个窗口)。因此,要关闭主窗口,我们必须直接使用WebDriver.Quit()。