2017-02-24 75 views
0

我正在使用:運行使用Selenium,NUnit的並行多browsertypes一個測試和C#

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

但是我不知道怎麼傳遞到瀏覽器<> 。如果我沒有通過任何事情,我會得到「意外使用未綁定的通用名稱」。如果我通過IWebDriver,我得到的'IWebDriver'必須是一個帶有公共無參數構造函數的非抽象類型,以便在泛型類型或方法'瀏覽器'中將其用作參數'TWebDriver'。

我已經達到了我的C#技能水平(作爲QA),我不知道如何解決這個問題,甚至是否可以解決!任何幫助將非常appriciated。

回答

0

所以在一個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"); 
    } 

} 
} 

這是瀏覽器類,我們將繼續在我們的框架:

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