在POM模型中,理想情况下,我们倾向于在基类中初始化驱动程序对象。并在分类的页面中传递此驱动程序对象。但是问题是也要避免通过此对象,并且测试也应该在XUNit框架中继续并行工作。下面是结构
public class BaseClass:IDisposable
{
public IWebDriver Driver{get;set;}
public BaseClass()
{
if(Driver == null)
{
Driver = new ChromeDriver();
}
}
}
public class Page1:BaseClass
{
public void method1()
{
this.Driver.Navigate.GoToUrl("http://www.google.com")
}
}
public class Page2:BaseClass
{
public void method2()
{
this.Driver.Navigate.GoToUrl("http://www.stackoverflow.com")
}
}
public class TestClass
{
[Fact]
public void Test1()
{
new Page1().method1();
new Page2().method2();
}
}
在上面的结构中,如果现在执行测试,则由于OOPS,将创建两个驱动程序对象实例。如果需要避免这种情况,我们可以将Driver对象设为静态,如果对象为null,则将其重新初始化。但是,当我们并行运行多个测试时,这将再次失败。有什么建议吗?我试图实现的是完全封装,其中Test类不应具有对Selenium对象的任何访问权。这些对象只能在Page类或它的Operation类中访问(如果有的话)。
答案 0 :(得分:0)
我们需要确保创建驱动程序单例及其线程安全以并行运行
[TestClass]
public class UnitTest1 : TestBase
{
[TestMethod]
public void TestMethod1()
{
new Page1().method1();
new Page2().method2();
Driver.Testcleanup();
}
[TestMethod]
public void TestMethod2()
{
new Page1().method1();
new Page2().method2();
Driver.Testcleanup();
}
public class Page1
{
public void method1()
{
Driver.Instance.Navigate().GoToUrl("http://www.google.com");
}
}
public class Page2
{
public void method2()
{
Driver.Instance.Navigate().GoToUrl("http://www.google.com");
}
}
}
Driver Class将处理单例的初始化和清理
public sealed class Driver
{
[ThreadStatic]
public static IWebDriver driver = null;
public static IWebDriver Instance
{
get
{
if (driver == null)
{
driver = new ChromeDriver();
}
return driver;
}
}
public static void Testcleanup()
{
driver.Quit();
driver = null;
}
}