当测试被赋予驱动程序类型作为测试用例时,如何实例化像WebDriverWait这样的变量?

时间:2013-04-10 21:38:39

标签: c# nunit selenium-webdriver

我在进行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变量。

我的问题是我在哪里可以实例化WebDriverWait和其他依赖于驱动程序的东西,当驱动程序作为[TestCase]给出时,它们通常用[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]中拥有的东西。

2 个答案:

答案 0 :(得分:1)

这里有两个选择。您没有提及Drivers上的WebDriverFactory属性是静态属性还是实例属性。如果它是静态属性,我会添加一个静态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);
}

答案 1 :(得分:0)

您可以使用[TestCase]实例化类型:

[TestCase(typeof(WebDriverWait))]
public class Test(Type driverType)
{
    _driver = Activator.CreateInstance(type, args);
}

我不知道您所有的确切类型和参数,但Activator.CreateInstance可能对您有所帮助。