当我执行测试时,会启动多个浏览器实例

时间:2018-10-15 11:16:12

标签: selenium selenium-webdriver c#-4.0 specflow

我正在实施框架,这是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);
        }

    }
}

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()。