通过c#/ selenium设置避免冗余

时间:2015-10-18 20:39:15

标签: c# selenium webdriver

我刚开始通过selenium webdriver学习自动化的基础知识,我正在努力“清理”我写的测试。我将每个测试分成了解决方案中自己的案例;但是,由于每个测试用例具有相同的设置和拆卸,显然对于解决方案中的每个单独测试用例执行这两者都是多余的。有没有办法在所有测试运行之前执行一次设置,并且在测试完成后一次完成拆卸?

以下是一个示例测试用例:

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;

namespace SeleniumTests
{
    [TestFixture]
    public class TestCase3Final
    {
    private IWebDriver driver;
    private StringBuilder verificationErrors;
    private string baseURL;
    private bool acceptNextAlert = true;

    [SetUp]
    public void SetupTest()
    {
        driver = new FirefoxDriver();
        baseURL = "http://adam.goucher.ca/parkcalc/index.php";
        verificationErrors = new StringBuilder();
    }

    [TearDown]
    public void TeardownTest()
    {
        try
        {
            driver.Quit();
        }
        catch (Exception)
        {
            // Ignore errors if unable to close the browser
        }
        Assert.AreEqual("", verificationErrors.ToString());
    }

    [Test]
    public void TestCase3()
    {
        driver.Navigate().GoToUrl(baseURL);
        driver.FindElement(By.Id("EntryDate")).Clear();
        driver.FindElement(By.Id("EntryDate")).SendKeys("01/02/2014");
        driver.FindElement(By.Id("ExitDate")).Clear();
        driver.FindElement(By.Id("ExitDate")).SendKeys("01/01/2014");
        driver.FindElement(By.Name("Submit")).Click();
        try
        {
            Assert.AreEqual("ERROR! YOUR EXIT DATE OR TIME IS BEFORE YOUR ENTRY DATE OR TIME", driver.FindElement(By.CssSelector("b")).Text.Trim());
        }
        catch (AssertionException e)
        {
            verificationErrors.Append(e.Message);
        }
    }
    private bool IsElementPresent(By by)
    {
        try
        {
            driver.FindElement(by);
            return true;
        }
        catch (NoSuchElementException)
        {
            return false;
        }
    }

    private bool IsAlertPresent()
    {
        try
        {
            driver.SwitchTo().Alert();
            return true;
        }
        catch (NoAlertPresentException)
        {
            return false;
        }
    }

    private string CloseAlertAndGetItsText() {
        try {
            IAlert alert = driver.SwitchTo().Alert();
            string alertText = alert.Text;
            if (acceptNextAlert) {
                alert.Accept();
            } else {
                alert.Dismiss();
            }
            return alertText;
        } finally {
            acceptNextAlert = true;
        }
    }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

通过使用基类并为方法分配属性,因此NUnit仍然可以理解基本测试夹具。

[TestFixture]
public class TestCase3Final : BaseTestFixture

...

public class BaseTestFixture {
 [TestFixtureSetup]
 public void SetupStuff() {
  // set up driver here using a [TestFixtureSetup] attribute
  // it will be run for every class that inherits from it.
 }
}

所以有一个基础测试夹具,所有其他人继承,只要它们从它继承,那么将为每一个调用设置方法。

注意,您的测试来自IDE或某些录制和播放。自动化+正确“清理测试”之类的东西要求您对所使用的语言有一定的了解,并了解OO原则。