使用Selenium,NUnit和C#并行运行多个browsertypes测试

时间:2017-02-24 16:37:22

标签: c# selenium nunit

我正在使用的内容:

  • Selenium WebDriver(v3.2.0)
  • NUnit(v3.6.0)
  • C#

我在网上找到了如何使用多种浏览器类型并行运行单个测试,我的代码如下,这有效:

namespace MultipleBrowserTest
{
    [TestFixture(typeof(FirefoxDriver))]
    [TestFixture(typeof(ChromeDriver))]
    [TestFixture(typeof(InternetExplorerDriver))]
    [TestFixture(typeof(EdgeDriver))]
    public class SiteLoadsTest<TWebDriver> where TWebDriver : IWebDriver, new()
    {
        private IWebDriver _driver;

        [Test]
        public void MultipleBrowserTests()
        {
            _driver = new TWebDriver();

            _driver.Navigate().GoToUrl("https://google.com/");

            Assert.AreEqual("https://google.com/", _driver.Url);
        }

        [TearDown]
        public void FixtureTearDown()
        {
            _driver?.Quit();
            if (_driver != null) _driver.Dispose();
        }
    }
}

但是,我想让这个更易于维护,以便质量保证的每个测试类都不必使用&#39; where ...&#39;来格式化课程。第1部分}})。我正在考虑让测试继承这样的Browser类:

public class SomeUITestClass<TWebDriver> where TWebDriver : IWebDriver, new()

将我的测试编辑为:

public class Browsers<TWebDriver> where TWebDriver : IWebDriver, new()
{

    private IWebDriver Browser { get; set; }

    public IWebDriver Driver
    {
        get
        {
            if (Browser == null)
            {
                throw new NullReferenceException(
"The WebDriver browser instance was not initialized.");
            }
            return null;
        }
        set { Browser = value; }
    }

    public void LaunchDriver()
    {
        Browser = new TWebDriver();
    }
}

但是,我不知道将什么传递给浏览器&lt;&gt;。如果我没有通过任何我得到的东西&#34;意外使用未绑定的通用名称&#34;。如果我传入namespace MultipleBrowserTest { [TestFixture(typeof(FirefoxDriver))] [TestFixture(typeof(ChromeDriver))] [TestFixture(typeof(InternetExplorerDriver))] [TestFixture(typeof(EdgeDriver))] public class SiteLoadsTest_InheritedBrowser : Browsers<> { [SetUp] public void Setup() { LaunchDriver(); } [Test] public void MultipleBrowserTests() { Driver.Navigate().GoToUrl("https://google.com/"); Assert.AreEqual("https://google.com/", Driver.Url); } [TearDown] public void FixtureTearDown() { Driver?.Quit(); if (Driver != null) Driver.Dispose(); } } } ,我会收到“IWebDriver”#39;必须是具有公共无参数构造函数的非抽象类型才能将其用作参数&#39; TWebDriver&#39;在通用类型或方法&#39;浏览器&#39;。

我已经达到了我的C#技能(作为QA),我不知道如何解决这个问题,甚至不知道它是否可以解决!任何帮助都会非常有用。

1 个答案:

答案 0 :(得分:0)

因此,在QA的帮助下,我们已经研究了如何使用反射来做到这一点。我们必须为我们的测试添加构造函数(参见下面的测试类):

IWebDriver

这是我们将在框架中保留的浏览器类:

namespace MultipleBrowserTest
{
[TestFixture(typeof(FirefoxDriver))]
[TestFixture(typeof(ChromeDriver))]
[TestFixture(typeof(InternetExplorerDriver))]
[TestFixture(typeof(EdgeDriver))]
public class SiteLoadsTest_InheritedBrowser : Browsers_Reflection
{
public SiteLoadsTest_InheritedBrowser(Type type) : base(type)
    {
    }

    [Test]
    public void MultipleBrowserTests()
    {
        Driver.Navigate().GoToUrl("https://google.com/");
        Driver.Url.ShouldContain("google");
    }

}
}

编辑:我们也在考虑使用我们遇到问题的UnityContainer,但已经解决了,这里是代码:

namespace MultipleBrowserTest
{
    public class Browsers_Reflection
    {       
        public Browsers_Reflection(Type type)
        {
            Driver = (IWebDriver)Activator.CreateInstance(type);
        }
        private IWebDriver Browser { get; set; }

        public IWebDriver Driver
        {
            get {
                if (Browser == null)
                    throw new NullReferenceException(
                        "The WebDriver browser instance was not initialized.");
                return Browser;
            }
            set { Browser = value; }
        }
    }
}