我正在尝试使用 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 一次的代码,下一次将离开它。我无法在构造函数中加载网页,因为在我的代码中,TabTestBase
或 TabTest
的构造函数运行时 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/