Совместное использование объекта dirver, инициализированного в базовом классе, с классом страниц - PullRequest
0 голосов
/ 08 января 2019

В модели 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 голосов
/ 09 января 2019

Нам нужно убедиться, что мы создаем синглтон драйвера и его потокобезопасный для параллельной работы

[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;

    }
}
...