c# - 如何在不重新加载页面的情况下运行第二次测试

标签 c# selenium testing nunit

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

Bronswer 枚举:

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();
    }
}

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

标签测试的基类:

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");
    }
}

此代码将用作测试单独选项卡的基类。

标签测试类:

[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 一次的代码,下一次将离开它。我无法在构造函数中加载网页,因为在我的代码中,TabTestBaseTabTest 的构造函数运行时 Driver 对象尚未设置,所以这解决方案不好。我有 2 个可行的解决方案,但它们看起来很不专业。

首先:

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

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

但在我看来,这看起来很不专业。第二个工作想法更糟糕:

只是在第一个测试 Test1 中添加导航到 url,而不是在 BeforeEachBase 方法中:

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

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

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

只是一个奖励问题:

现在我可以在 3 种不同的浏览器上一一运行测试。有什么方法可以重建我的代码以一次完成此操作(并行或多线程?)

谢谢。

最佳答案

这里的问题是你的

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

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

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

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

关于c# - 如何在不重新加载页面的情况下运行第二次测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43259202/

相关文章:

javascript - 测试未运行服务模拟 promise (.then)

C# 使用 T4 生成枚举

c# - 在 WHERE 子句中使用日期时间执行查询

javascript - 错误 : Jmeter: Typed variable declaration : Class or variable not found: org. openqa.selenium:在第 4 行

vba - 如何通过Selenium和VBA根据html从第2行第2列中提取文本8

testing - 单击 Selenium webdriver 中的提交按钮时,是否有办法将注意力集中在不同的元素上

c# - 通过关注正则表达式中定义的边界情况,从正则表达式生成示例数据以验证输入字符串

c# - "Use of unassigned local variable"错误的原因是什么?

c# - 数组构造函数与 StructureMap 的依赖关系

java - 使用 Selenium Webdriver 时如何打开通常的 chrome 或 Firefox 窗口?