简体   繁体   English

Xunit 为每个新测试创建测试类的新实例(使用 WebDriver 和 C#)

[英]Xunit create new instance of Test class for every new Test ( using WebDriver and C#)

Is there any way to run multiple tests in same browser using Webdriver (Selenium) using Xunit, , at present xunit launches new browser for every new test , below is the sample code有没有办法使用Xunit在同一个浏览器中使用Webdriver(Selenium)运行多个测试,目前xunit为每个新测试启动新的浏览器,下面是示例代码

public class Class1

{
    private FirefoxDriver driver;
    public Class1()
    {
         driver = new FirefoxDriver();
    }

    [Fact]
    public void Test()
    {
        driver.Navigate().GoToUrl("http://google.com");
        driver.FindElementById("gbqfq").SendKeys("Testing");
    }

    [Fact]
    public void Test2()
    {
        driver.Navigate().GoToUrl("http://google.com");
        driver.FindElementById("gbqfq").SendKeys("Testing again");
    }

}

While I don't know Selenium, I do know that xUnit.net creates a new instance of your test class for every test method, so that probably explains why you are seeing the behaviour you're reporting: the driver field is initialized anew for each test method, because the constructor is invoked every time.虽然我不了解 Selenium,但我知道 xUnit.net 为每个测试方法创建了一个测试类的新实例,所以这可能解释了为什么您会看到您报告的行为: driver字段被重新初始化为每个测试方法,因为每次都会调用构造函数。

In order to reuse a single FirefoxDriver instance, you can use xUnit.net's IUseFixture<T> interface:为了重用单个FirefoxDriver实例,您可以使用 xUnit.net 的IUseFixture<T>接口:

public class Class1 : IUseFixture<FirefoxDriver>
{
    private FirefoxDriver driver;

    public void SetFixture(FirefoxDriver data)
    {
        driver = data;
    }

    [Fact]
    public void Test()
    {
        driver.Navigate().GoToUrl("http://google.com");
        driver.FindElementById("gbqfq").SendKeys("Testing");
    }

    [Fact]
    public void Test2()
    {
        driver.Navigate().GoToUrl("http://google.com");
        driver.FindElementById("gbqfq").SendKeys("Testing again");
    }    
}

after some investigation able to find the solution here it is and also updated FirefoxDriver to IWebDriver::经过一番调查,在这里找到了解决方案,并将 FirefoxDriver 更新为 IWebDriver::

   public class SampleFixture : IDisposable
   {
    private IWebDriver driver;
    public SampleFixture()
    {
        driver = new FirefoxDriver();
        Console.WriteLine("SampleFixture constructor called");

    }

    public IWebDriver InitiateDriver()
    {
        return driver;
    }

    public void Dispose()
    {
       // driver.Close();
        driver.Quit();
        Console.WriteLine("Disposing Fixture");
    }
}

public class Class1 : IUseFixture<SampleFixture>
{
    private IWebDriver driver;

    public void SetFixture(SampleFixture data)
    {
        driver = data.InitiateDriver();
    }

    [Fact]
    public void Test()
    {
        driver.Navigate().GoToUrl("http://google.com");
        driver.FindElement(By.Id("gbqfq")).SendKeys("Testing");
    }

    [Fact]
    public void Test2()
    {
        driver.Navigate().GoToUrl("http://google.com");
        driver.FindElement(By.Id("gbqfq")).SendKeys("Testing again");
    }
}

IUseFixture doesn't exist any more and seems replaced by IClassFixture . IUseFixture不再存在,似乎被IClassFixture取代。 But I can't directly inject the FirefoxDriver as posted by @Mark Seemann:但我不能直接注入FirefoxDriver如张贴@马克西曼:

public class DashboardCategoryBoxes : IClassFixture<FirefoxDriver> {
    IWebDriver driver;
    public DashboardCategoryBoxes(FirefoxDriver driver) {
        //this.driver = wrapper.Driver;
        this.driver = driver;
    }
}

This throw an error这抛出一个错误

 System.AggregateException : One or more errors occurred. (Class fixture type 'OpenQA.Selenium.Firefox.FirefoxDriver' may only define a single public constructor.) (The following constructor parameters did not have matching fixture data: FirefoxDriver driver)
    ---- Class fixture type 'OpenQA.Selenium.Firefox.FirefoxDriver' may only define a single public constructor.
    ---- The following constructor parameters did not have matching fixture data: FirefoxDriver driver

As a workaround, we could create some wrapper class without constructor作为一种解决方法,我们可以创建一些没有构造函数的包装类

public class FirefoxWrapper {
    FirefoxDriver driver = new FirefoxDriver();
    public FirefoxWrapper Driver {
        get { return driver; }
    }
}

and fetch the driver from there并从那里获取驱动程序

public class DashboardCategoryBoxes : IClassFixture<FirefoxWrapper> {
    IWebDriver driver;
    public DashboardCategoryBoxes(FirefoxWrapper wrapper) {
        driver = wrapper.Driver;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM