【发布时间】:2020-01-14 20:03:28
【问题描述】:
我想使用 selenium 和 .NET Core 和 xUnit 在多个浏览器上运行 UI 测试。我发现很少有使用nUnit 的TestFixture 属性的示例。但是,我特别在寻找xUnit 解决方案。
我找到了this 解决方案,我可以在其中创建从DataAttribute 派生的我自己的属性
public class BrowserAttribute : DataAttribute
{
private IWebDriver Driver { get; set; }
public BrowserAttribute(string browser, string url)
{
switch (browser)
{
case "Chrome":
Driver = new ChromeDriver();
break;
case "IE":
Driver = new InternetExplorerDriver();
break;
case "Firefox":
Driver = new FirefoxDriver();
break;
}
Driver.Manage().Window.Maximize();
Goto(url);
}
public void Goto(string url)
{
Driver.Url = url;
}
public override IEnumerable<object[]> GetData(MethodInfo testMethod)
{
return new[] { new object[] { Driver } };
}
}
然后测试看起来像
[Theory]
[Browser("IE", "http://www.google.co.uk")]
[Browser("Firefox", "http://www.google.co.uk")]
[Browser("Chrome", "http://www.google.co.uk")]
public void Test(IWebDriver driver)
{
// Test something with IWebDriver
// i can do driver.Close() here to dispose IWebDriver
}
这行得通 但是,它不会在测试完成后释放 IWebDriver,除非我在每个测试中显式调用 Close()
在 IWebDriver 上调用 Close() 的最佳选择是什么?
更新1
我创建了从BeforeAfterTestAttribute 派生的自定义属性,并在类级别应用了该属性。它奏效了。但是,当它调用GetCustomAttributes(..) 时,它会重新执行测试
public class AfterTest : Xunit.Sdk.BeforeAfterTestAttribute
{
public override void After(MethodInfo methodUnderTest)
{
//at line below the test get executed again
var attributes = methodUnderTest.GetCustomAttributes(typeof(BrowserAttribute),true);
var att = attributes.First() as BrowserAttribute;
att.Driver.Close();
base.After(methodUnderTest);
}
}
有什么方法可以在After 方法中获取 IWebDriver 的实例?
【问题讨论】:
-
我会扫描一下 xunit slack,看看是否有其他人尝试过这种方法。 (疯狂猜测:也许使用 MemberData 你可以在每次使用后 Dispose ?)
标签: c# selenium selenium-webdriver .net-core xunit.net