如何在没有重装页面的情况下运行第二次测试

时间:2017-04-06 15:16:18

标签: c# selenium testing nunit

我正在尝试使用Selenium创建我的网页测试,并且我已经卡在一个地方。我需要在网页上的相同选项卡上运行一些测试但不重新加载它。这听起来很简单,但我还添加了一些解决方案,允许我在许多浏览器中运行相同的测试。让我通过展示更多代码来解释我的问题:

Bronswer enum:

public enum Browser
{
    InternetExplorer,
    FireFox,
    Chrome
}

此代码将在以后用于切换浏览器,

主要基类:

[TestFixture(Browser.InternetExplorer)]
[TestFixture(Browser.FireFox)]
[TestFixture(Browser.Chrome)]
public class TestBase
{
    protected RemoteWebDriver Driver;
    protected Browser BrowserType;
    protected List<Browser> BronswersToRun;
    internal TestBase(Browser browser) : this(browser, new List<Browser>())
    {
    }

    public TestBase(Browser browser, List<Browser> bronswersToRun)
    {
        BrowserType = browser;
        BronswersToRun = bronswersToRun;
    }

    [TestFixtureSetUp]
    public virtual void SetUp()
    {
        if (BronswersToRun.Any() && !BronswersToRun.Contains(BrowserType))
        {
            Assert.Ignore();
        }
        switch (BrowserType)
        {
            case Browser.Chrome:
                {
                    Driver = new ChromeDriver();
                    break;
                }
            case Browser.FireFox:
                {
                    Driver = new FirefoxDriver();
                    break;
                }
            case Browser.InternetExplorer:
                {
                    var options = new InternetExplorerOptions { IntroduceInstabilityByIgnoringProtectedModeSettings = true };
                    Driver = new InternetExplorerDriver(options);
                    break;
                }
            default:
                Assert.Ignore();
                break;
        }
    }
    [SetUp]
    public virtual void BeforeEachBase()
    {
        Driver.Navigate().GoToUrl("http:MyWebPage/");
    }

    [TearDown]
    public virtual void AfterAllBase()
    {

    }
    ~TestBase()
    {
        Driver.Close();
    }
}

如果我愿意,这个类允许我在多个互联网浏览器中运行测试。我将在构造函数中传递浏览器列表(现在刚从设置中硬编码),所以如果不在列表测试中的浏览器将被忽略。

标签测试的基类:

public class TabTestBase : TestBase
{
    protected IReadOnlyCollection<IWebElement> SearchElemens;
    public TabTestBase(Browser s):base(s,new List<Browser>{Browser.InternetExplorer})
    {
    }

    public override void BeforeEachBase()
    {
        Driver.Navigate().GoToUrl("http:MyWebPage/Tab");
    }
}

此代码将用作测试单独Tab的基类。

选项卡测试类:

[TestFixture]
public class TabTest : TabTestBase
{
    public TabTest(Browser s) : base(s)
    {
    }

    [Test]
    public void Test1()
    {
          //Tests
    }

    [Test]
    public void Test2()
    {
          //Tests
    }
}

总的来说一切正常。运行TabTest类时,它会在此选项卡上启动我的网页并开始测试。问题是每个测试都运行BeforeEachBase()方法TabTestBase,所以只需要刷新此页面。我想创建只运行Tab一个的代码,然后将离开它。我无法在构造函数中加载Web页面,因为在我的代码中运行TabTestBaseTabTest的构造函数Driver时,对象尚未设置,因此此解决方案很糟糕。我有2个工作解决方案,但看起来非常不专业。

首先:

添加将检查BeforeEachBase()已运行的参数,如果是,则跳过它:

public override void BeforeEachBase()
{
    if (firstRun)
    {
        Driver.Navigate().GoToUrl("http:MyWebPage/Tab");
        firstRun = false;
     }   
}

但我认为这看起来非常不专业。第二个工作想法甚至是最糟糕的:

只是添加导航到第一个测试Test1而不是BeforeEachBase方法中的网址:

[Test]
public void Test1()
{
       Driver.Navigate().GoToUrl("http:MyWebPage/Tab");
       // TESTS
}

但正如我所说,这甚至比第一个想法更糟糕。

所以我的问题是:有没有办法做到这一点好看又清楚?只是为了不每次刷新页面?

只是一个奖励问题:

现在我可以逐个在3种不同的浏览器上运行测试。有没有办法重建我的代码一次执行此操作(并行或多线程?)

感谢。

1 个答案:

答案 0 :(得分:2)

这里的问题是你的

[SetUp]
public virtual void BeforeEachBase()
{
    Driver.Navigate().GoToUrl("http:MyWebPage/");
}

此方法将在每个[Test]之前运行,它会导致您看到的行为,我建议一起删除此方法,并在最后添加[TestFixtureSetUp]添加< / p>

Driver.Navigate().GoToUrl("http:MyWebPage/");

这将确保每个灯具只发生一次导航,[SetUp][TearDown]是测试特定的,这意味着它们将在每次测试之前和之后运行。