簡體   English   中英

使用Selenium,NUnit和C#在多種瀏覽器類型上並行運行一項測試

[英]Running one tests on multiple browsertypes in parallel using Selenium, NUnit and C#

我正在使用什么:

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

並編輯我的測試是這樣的:

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

但是我不知道該如何傳遞給Browsers <>。 如果我沒有通過任何操作,則會得到“意外使用了未綁定的通用名稱”。 如果我傳入IWebDriver我將獲得“ IWebDriver”必須是具有公共無參數構造函數的非抽象類型,以便將其用作通用類型或方法“瀏覽器”中的參數“ TWebDriver”。

我已經達到了我的C#技能(作為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; }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM