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

标签 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 变量已经被声明。

我的问题是,当驱动程序作为 [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/

相关文章:

c# - System.IO.Compression.GZipStream 创建的 7z 解码文件失败

javascript - 内联 If Then 语句。网络

c# - 使用 Int64 进行位移

c# - 如何在 NUnit 中测试此 View 模型的异步行为?

java - 从excel中读取测试数据

selenium - 如何在不使用 Selenium 服务器的情况下从 Protractor headless 运行 Chrome

c# - Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

c# - 将测试方法放在您正在测试的同一个类中有什么问题吗?

testing - 在 NUnit [TearDown] 中,如何确定测试是否单独运行?

java - 使用 Java 使用 Selenium WebDriver 捕获浏览器日志