使用chromedriver和specflow时,每步都会打开一个新的浏览器实例

我在Specflow中遇到问题。由于某些原因,每个步骤都会启动chrome的新实例。 你能帮忙吗?

对于跟随测试,启动3个步骤,3个chrome实例。

Feature: Home

Background: 
Given The  QA Department site

Scenario: QA Department title 
    When QA site open
    Then QA site tile must be "UI Testing Site"

第一个实例具有我想要的内容,而其他两个我不知道为什么启动的内容为空。

namespace QAtests.SpecFlow_Steps.Home
{


     using NUnit.Framework;
     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;
     using TechTalk.SpecFlow;

    [Binding]
     class HomeTestSteps
    {
        private readonly MainPage mainPage = new MainPage();
        private readonly PageHelper pageHelper = new PageHelper();

        public HomeTestSteps()
        {

        }

        [When(@"QA Department site open")]
        public void GivenQADepartmentSiteOpen()
        {
            var url = this.mainPage.ValiteSiteAddress();
            Assert.AreEqual(url,this.mainPage.siteURL);
        }


        [Then(@"QA Department site tile must be ""(.*)""")]
        public void ThenQADepartmentSiteTileMustBe(string pageTile)
        {
            var title = this.pageHelper.GetElementTitle();
            Assert.AreEqual(pageTile,title);
        }

    }
}

主页类仅设置网址并检查元素


namespace QAtests.Pages.Main
{
    public class MainPage
    {

        private ChromeDriver driver = new ChromeDriver();
        private readonly string elementTitle = "//title";
        public readonly string siteURL = "http://uitest.duodecadits.com/";

        public MainPage()
        {

        }


        public void StartSite()
        {
            try
            {
                this.driver.Navigate().GoToUrl(siteURL);
            }
            catch (Exception e)
            {
                throw new Exception("Can´t set address.",e);
            }

        }

        public void Close()
        {
            this.driver.Close();
        }

        public string ValiteSiteAddress()
        {
            return this.driver.Url;
        }

        public IWebElement ElementTitleisVisible()
        {
            try
            {
                return this.driver.FindElement(By.XPath(elementTitle));
            }
            catch(Exception e){
                throw new Exception("Element tile not found.",e);
            }

        }
    }
}

我认为这与

的声明有关
private ChromeDriver driver = new ChromeDriver();

zphandwll 回答:使用chromedriver和specflow时,每步都会打开一个新的浏览器实例

您每次实例化页面时都实例化一个新的ChromeDriver实例。

根据建议,您将需要在BeforeScenario步骤中设置网络驱动程序。

此外,您可以使用内置的IOC容器并注册Web驱动程序实例。然后,可以在需要时将该实例注入到您的任何页面对象中。

类似...

[Binding]
public class BaseScenarioHooks
{
    protected IObjectContainer Container;

    public BaseScenarioHooks(IObjectContainer container)
    {
        Container = container;
    }

    [BeforeScenario(Order = 3)]
    public void SetupDrivers()
    {
        var webDriver = new WebDriver(browser,seleniumHub,url,Context.ScenarioInfo.Title,Context["UniqueTestName"].ToString(),FrameworkConfiguration.VideoRecording);

        Container.RegisterInstanceAs<WebDriver>(webDriver);
    }
}

看看https://github.com/techtalk/SpecFlow/wiki/Context-Injection

也可以看看here,以获取有关如何组织驾驶员课程的想法

,

在这里看不到您的话题获得很多爱。老实说,我会在网上寻找一个SpecFlow框架,然后从那里开始构建您的框架。 SpecFlow使用挂钩,因此您可能希望使用BeforeScenario调用浏览器,以便为每个测试调用一次。将您的清理工作放在AfterScenario挂钩中。

如果使用nuget chromedriver并将其设置为始终输出到bin调试文件夹,则可以使用GetBasePath调用,以便它始终从该目录调用。您可以删除呼叫,但可以对chromedrive.exe路径进行硬编码。如果要进行源代码控制,这只会变得更加容易。

希望这会帮助您入门。

例如。

MyFile.cs

  [BeforeScenario]
  public static void Startup()
  {
  Browser.StartWebDriver();

  }

Browser.cs

 public class Browser
 {
    static IWebDriver _Driver;
    static WebDriverWait _wait;

  public static void StartWebDriver()
  {
                ChromeDriverService service = ChromeDriverService.CreateDefaultService(Path.Combine(GetBasePath,@"bin\Debug\"));
                ChromeOptions options = new ChromeOptions();
                options.AddArguments("--disable-extensions");
                options.AddAdditionalCapability("useAutomationExtension",false);
                options.AddExcludedArgument("enable-automation");
                _Driver = new ChromeDriver(service,options);
                _wait = new WebDriverWait(_Driver,TimeSpan.FromSeconds(10));


  }




    public static string GetBasePath
    {
        get
        {
            var basePath =
                System.IO.Path.GetDirectoryName((System.Reflection.Assembly.GetExecutingAssembly().Location));
            basePath = basePath.Substring(0,basePath.Length - 10);
            return basePath;
        }
    }
  }
,

是的。这行

private ChromeDriver driver = new ChromeDriver();

绝对是您的问题。每次访问该属性时,您都在创建一个新的驱动程序。

这是我在测试中使用的网络挂钩类。

[Binding]
internal sealed class WebHooks
{
    private readonly IObjectContainer _objectContainer;

    public WebHooks(IObjectContainer objectContainer)
    {
        _objectContainer = objectContainer;
    }

    [BeforeScenario("web")]
    public void BeforeWebScenario()
    {
        var options = new ChromeOptions();
        options.AddArgument("--start-maximized");
        options.AddAdditionalCapability("useAutomationExtension",false);
        options.AddArgument("no-sandbox");

        //HACK: this fixes issue with not being able to find chromedriver.exe
        //https://stackoverflow.com/questions/47910244/selenium-cant-find-chromedriver-exe
        var webDriver = new ChromeDriver(".",options);
        webDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);

        _objectContainer.RegisterInstanceAs<IWebDriver>(webDriver);
    }

    [AfterScenario("web")]
    public void AfterWebScenario()
    {
        var webDriver = _objectContainer.Resolve<IWebDriver>();

        if (webDriver == null) return;

        webDriver.Close();
        webDriver.Dispose();
    }
}

因此,这会将Webdriver注册到内部SpecFlow DI容器中,以便现在可以在步骤定义中调用它。

然后修改您的步骤定义类,以将Webdriver作为构造函数参数访问

[Binding]
public class YourSteps
{
    private readonly IWebDriver _webDriver;

    public CanvasSteps(IWebDriver webDriver)
    {
        _webDriver = webDriver;
    }
}

Specflow的内部DI自动将所有内容连接起来,现在每个方案应具有1个webdriver实例。由于您已经从步骤中提取了对Webdriver实例的横切关注点,并将其放在所属的Hook中,因此,它也可以创建更好的设计。只需使用@web钩子标记场景即可

本文链接:https://www.f2er.com/3091974.html

大家都在问