【问题标题】:Running one tests on multiple browsertypes in parallel using Selenium, NUnit and C#使用 Selenium、NUnit 和 C# 在多个浏览器类型上并行运行一项测试
【发布时间】:2017-03-01 19:52:48
【问题描述】:

我正在使用什么:

  • 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();
        }
    }
}

但是,我想让它更易于维护,以便 QA 不必使用“where...”部分 (public class SomeUITestClass&lt;TWebDriver&gt; 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();
    }
}

并将我的测试编辑成这样:

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,我得到的“IWebDriver”必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法“浏览器”中的参数“TWebDriver”。

我已经达到了我的 C# 技能(作为 QA)的程度,但我不确定如何解决这个问题,甚至不确定它是否可以解决!任何帮助将不胜感激。

【问题讨论】:

    标签: c# selenium nunit


    【解决方案1】:

    因此,在一位 QA 同事的大力帮助下,我们研究出了如何使用反射来完成此任务。我们必须为我们的测试添加构造函数(见下面的测试类):

    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");
        }
    
    }
    }
    

    这是我们将保留在框架中的 Browser 类:

    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; }
            }
        }
    }
    

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

    namespace MultipleBrowserTest
    {
        public class Browsers_UnityContainer
        {
            public Browsers_UnityContainer(Type type)
            {
            _unityContainer.RegisterType(typeof(IWebDriver), type, new InjectionConstructor());
            Browser = _unityContainer.Resolve<IWebDriver>();
    
            }
    
            private IWebDriver Browser { get; set; }
            private readonly UnityContainer _unityContainer = new UnityContainer();
    
            public IWebDriver Driver
            {
                get { return Browser; }
                set { Browser = value; }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 2017-11-02
      • 1970-01-01
      相关资源
      最近更新 更多