我正在使用的内容:
我在网上找到了如何使用多种浏览器类型并行运行单个测试,我的代码如下,这有效:
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),我不知道如何解决这个问题,甚至不知道它是否可以解决!任何帮助都会非常有用。
答案 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; }
}
}
}