执行测试时启动多个浏览器实例



我是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);
}
}
}

您正在使用 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();
}
}

我想建议你不要使用它们,没有钩子的绑定类。 即 [BeforeTestRun] [AfterTestRun] 改用它们。

[AfterScenario]
public void CleanUp()
{
if (seleniumDriver != null)
{
SeleniumDriver.Dispose();
seleniumDriver = null;
}
}

可以在测试运行级别(而不是方案级别(初始化和关闭驱动程序。并在方案级别单独维护 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 对象,它将抛出 No 这样的会话错误。

WebDriver.Close(( 用于关闭子窗口,如果我们正在处理多个窗口。所以要关闭主窗口,我们必须直接使用 WebDriver.Quit((。

最新更新