我正在尝试使用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页面,因为在我的代码中运行TabTestBase
或TabTest
的构造函数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种不同的浏览器上运行测试。有没有办法重建我的代码一次执行此操作(并行或多线程?)
感谢。
答案 0 :(得分:2)
这里的问题是你的
[SetUp]
public virtual void BeforeEachBase()
{
Driver.Navigate().GoToUrl("http:MyWebPage/");
}
此方法将在每个[Test]
之前运行,它会导致您看到的行为,我建议一起删除此方法,并在最后添加[TestFixtureSetUp]
添加< / p>
Driver.Navigate().GoToUrl("http:MyWebPage/");
这将确保每个灯具只发生一次导航,[SetUp]
和[TearDown]
是测试特定的,这意味着它们将在每次测试之前和之后运行。