我正在做 UI 测试。起初我只使用 Firefox 浏览器驱动程序,所以我会在类下声明 WebDriverWait 变量并将其分配在 [SetUp] 方法下,如代码块所示,每个测试都可以使用它。
public class FirefoxTest {
public IWebDriver _driver;
public WebDriverWait _wait;
[SetUp]
public void SetupTest() {
_driver = new FirefoxDriver();
_wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(30));
}
然后我尝试通过使用 [TestCaseSource(typeof(WebDriverFactory), "Drivers")] 属性指定它们来合并更多的 BrowserDrivers。所以现在 _driver 变量必须从 [SetUp] 中移出,而 _wait 变量不知道要使用什么 _driver。
我尝试在每个测试中实例化它,但这是重复的,并且那些测试使用的方法也需要 WebDriverWait 变量,并且当另一个测试试图实现它们时,这些方法不会再次运行,因为 WebDriverWait 变量已经被声明。
我的问题是,当驱动程序作为 [TestCase] 给出时,我在哪里可以实例化 WebDriverWait 和其他依赖于驱动程序并且通常写在 [SetUp] 和 [TearDown] 中的东西,例如 driver.Quit()。
现在我的测试写成这样
[TestCaseSource(typeof(WebDriverFactory), "Drivers")]
public void SomeTest(IWebDriver driver){
driver.Navigate().GoTo....
}
问题是我必须包含
WebDriverWait _wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
driver.Quit()
在所有测试中以及在测试中重用的所有方法中的_wait。我在 [SetUp] 和 [Teardown] 中拥有的东西。
最佳答案
这里有两个选择。您没有提及 WebDriverFactory
上的 Drivers
属性是静态属性还是实例属性。如果它是一个静态属性,我会添加一个静态的 QuitAll
方法,我可以在我的 TearDown
方法中调用它。如果它是一个实例方法,事情就会变得更加棘手,我不确定您是否可以使用 NUnit 从这里到达那里。
另一方面,不是创建一个 WebDriverFactory
类来实例化驱动程序,而是另一种形式的 TestCaseSource
属性允许您指定一个属性或字段你的测试所在的类。它可能也适用于基类的属性或字段,但你必须尝试一下才能确定。然后,您可以使用运行测试的同一类的成员,并且可以完全控制驱动程序对象的生命周期。这看起来像这样:
// WARNING! Untested code written from memory
// without the aid of an IDE. Not guaranteed to
// work or even compile without modification.
// Use private field, public property
// (personal choice).
private List<IWebDriver> activeDrivers = new List<IWebDriver>();
public List<IWebDriver> ActiveDrivers
{
get { return this.activeDrivers; }
}
[TestFixtureSetUp]
public void InitializeDrivers()
{
// Will run once for the class.
// Use [SetUp] attribute to run
// before each test method.
this.activeDrivers.Add(new InternetExplorerDriver());
this.activeDrivers.Add(new FirefoxDriver());
this.activeDrivers.Add(new ChromeDriver());
}
[TestFixtureTearDown]
public void QuitAllDrivers()
{
foreach(IWebDriver driver in this.activeDrivers)
{
driver.Quit();
}
}
[TestCaseSource("ActiveDrivers")]
public void MyTest(IWebDriver driver)
{
// Test goes here
}
请注意,我没有提及您的 WebDriverWait
字段。这是因为 WebDriverWait
对象非常轻量级,并且构造成本不高。如果您认为按需构造函数在您的代码中看起来很丑陋或过于冗长,您可以将其分解为一个单独的方法,您可以从测试中调用它,如下所示:
private void WaitUntil<T>(IWebDriver driver, Func<IWebDriver, T> until)
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until<T>(until);
}
关于c# - 当测试被赋予驱动程序类型作为测试用例时,如何实例化像 WebDriverWait 这样的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936911/