将基类中初始化的驱动程序对象与页面类共享

时间:2019-01-08 11:06:19

标签: c# selenium oop xunit pageobjects

在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类中访问(如果有的话)。

1 个答案:

答案 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;

    }
}