【发布时间】: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<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)的程度,但我不确定如何解决这个问题,甚至不确定它是否可以解决!任何帮助将不胜感激。
【问题讨论】: