C# İle Selenium WebDriver’da POM Kullanımı

Önceki yazımızda Selenium Web Driver’a ilk adımımızı atmıştık bu yazımızda bir adım ileriye gitmeye çalışacağız. Bu sefer tek bir sayfa için değil projemizde yer alan tüm sayfalar için test kodu yazacak çatıyı kuracağız. Bu çatıyı kurarken POM (Page Object Model) tasarım modelini kullanıyor olacağız. Peki nedir bu POM?

Page Object Model Nedir?

Bu tasarım modelinde her sayfa bir sınıfı (class) temsil etmektedir.  Sayfayı temsil eden sınıfta o sayfada yer alan bileşenler (Textbox, Combobox vb.) ve metotlar tanımlanmaktadır.

Page Object Model’in Avantajları Nelerdir?

  • Her sayfa için bir sınıf oluşturulduğu için test kodunun bakımı kolaydır böylece nereyi değiştireceğinizi aramadan kolayca bulabilirsiniz.
  • Temiz ve anlaşılır test kodu yazmış olursunuz.
  • Sınıflarda yaptığınız değişiklik otomatik olarak test kodunuza da yansır bu şekilde dinamik bir yapı kurmuş olursunuz.

Visual Studio İle Test Projesi Oluşturmak

Bilgisayarınızda Visual Studio Kurulu değilse buraya tıklayarak bilgisayarınıza indirip kurabilirsiniz. Visual Studio’yu açtıktan sonra File menüsünden New > Project seçeneğine basın. Karşınıza New Project ekranı açılacaktır.

New Project Penceresi

New Project ekranından Visual C# sekmesi altında yer alan Test seçeneğine basın. Proje tipi olarak Unit Test Project (.NET Framework) seçin. Name alanına projenizin adını yazarak OK butonuna basın. Visual Studio otomatik olarak projeyi oluşturacaktır.

Kullanılacak Kütüphanelerin Projeye Dahil Edilmesi

Solution Explorer menüsünde projemizin altında yer alan References yazısına sağ tıklayın ve Manage NuGet Packages‘i açın. Manage NuGet Packages ekranında Browse alanında yer alan arama bölümüne “selenium web driver” yazın. Burada Selenium.WebDriver, Selenium.Chrome.WebDriver ve Selenium.Support kütüphanelerini Install butonuna basarak projenize kurun.

Manage NuGet Packages

Klasör Yapısının Oluşturulması

İlk olarak yeni proje oluştururken Visual Studio bizim için UnitTest1.cs adında boş bir sınıf oluşturduğunu görüyoruz bunu sağ tıklayarak projenizden silin. Sayfalarımızı temsil edecek sınıflar için Pages adında bir klasör oluşturun. Daha sonra test kodlarını yazacağımız unit test sınıfları içinse Tests adında bir klasör oluşturun. Koleksiyonların yer alacağı klasör içinse Collections adında bir klasör oluşturun.  Test projelerinizi bu şekilde klasörleyerek aradığınızı daha kolay bulabilirsiniz.

BaseCollection Sınıfının Oluşturulması

Collection sınıfımızda proje genelinde kullanacağımız web driver nesnesini property olarak tanımlıyoruz bu sayede her sayfada web driver nesnesinin örneğini yaratmadan dinamik bir yapı kurmuş olacağız. Collection sınıfına ait test kodumuz aşağıdaki gibidir.

using OpenQA.Selenium;

namespace PomProject
{
    public class BaseCollection
    {
        public static IWebDriver webDriver { get; set; }
    }
}

LoginCollection Sınıfının Oluşturulması

LoginCollection sınıfında ise LoginPage sayfasına özgü linkler, hata mesajlarını tanımlayacağız. LoginCollection sınıfını Collections klasörünün altına oluşturun. LoginCollection sınıfına ait test kodları aşağıdaki gibidir:

namespace PomProject
{
    public class LoginCollection
    {
        public static string loginUrl = "http://localhost:8383/DemoLogin/index.html";
        public static string incorrectAlert = "Kullanıcı adı veya parola hatalı.";
        public static string correctLoginVerifyText = "Hoşgeldiniz";
    }
}

LoginPage Sınıfının Oluşturulması

İlk olarak login sayfası için sınıfımızı oluşturup test kodumuzu yazmaya başlayalım. Pages klasörünün üzerine sağ tıklayarak Add > Class seçeneğine basın. Karşınıza aşağıdaki gibi bir ekran gelecek.  Class seçip Name alanına sınıfınızın adını yazıp Add butonuna basın.

LoginPage.cs Oluşturma

Selenium WebDriver kütüphanesini oluşturduğumuz sınıfta kullanabilmek için using bölümüne ekliyoruz. LoginPage.cs sınıfının kodları aşağıdaki gibidir.

using OpenQA.Selenium;
using OpenQA.Selenium.Support.PageObjects;

namespace PomProject.Pages
{
    public class LoginPage
    {
        public LoginPage()
        {
            PageFactory.InitElements(BaseCollection.webDriver, this);
        }

        #region Ekran Bileşenleri Tanımlandı.
        [FindsBy(How = How.Id, Using = "kullaniciAdi")]
            public IWebElement txtKullaniciAdi { get; set; }

            [FindsBy(How = How.Id, Using = "parola")]
            public IWebElement txtParola { get; set; }

            [FindsBy(How = How.Id, Using = "btnGirisYap")]
            public IWebElement btnGirisYap { get; set; }
        #endregion 


        #region Oturum Açma metotu oluşturuldu.
            public void SignIn(string kullaniciAdi, string parola)
            {
                txtKullaniciAdi.SendKeys(kullaniciAdi);
                txtParola.SendKeys(parola);
                btnGirisYap.Click();
            }
        #endregion
    }
}

LoginPageTest Sınıfının Oluşturulması

LoginPage.cs sınıfı için test kodlarımızı yazmaya başlayalım bunun için Tests klasörüne sağ tıklayın Add > New Item > Test > Basic Unit Test seçin Name alanına test sınıfının adını yazın ve Add butonuna basın.

LoginPageTest.cs Oluşturma

LoginPageTest sınıfına ait test kodları aşağıdaki gibidir.

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using PomProject.Pages;

namespace PomProject.Tests
{
    [TestClass]
    public class LoginPageTest
    {
        // TestInitialize anatasyonu test kodu yürütülmeden önce yapılacakları belirtmektedir.
        [TestInitialize]
        public void SetUp()
        {
            BaseCollection.webDriver = new ChromeDriver();
            BaseCollection.webDriver.Manage().Window.Maximize();
            BaseCollection.webDriver.Navigate().GoToUrl(LoginCollection.loginUrl);
            string title = BaseCollection.webDriver.Title;
            Console.WriteLine("Sayfa başlığı {0} olan sayfa için test otomasyonu başlatıldı.", title);
        }

        //Kullanıcı adı veya parolanın hatalı girildiği durum test edildi.
        [TestMethod]
        public void InCorrectLoginTest()
        {
            LoginPage loginPage = new LoginPage();
            // Kullanıcı adı veya parola hatalı gönderildi.
            loginPage.SignIn("admin", "123");

            // Gelen hata mesajı alertMessage değişkenine atandı.
            string alertMessage = BaseCollection.webDriver.SwitchTo().Alert().Text;

            // Beklenen hata mesajı ile gelen hata mesajları karşılaştırıldı.
            Assert.AreEqual(alertMessage, LoginCollection.incorrectAlert);
            Console.WriteLine("InCorrectLoginTest başarıyla tamamlandı.");
        }

        //Kullanıcı adı ve parolanın doğru olduğu durum test edildi.
        [TestMethod]
        public void CorrectLoginTest()
        {
            LoginPage loginPage = new LoginPage();

            //Kullanıcı adı ve parola doğru gönderildi.
            loginPage.SignIn("admin", "123456");

            //Oturum açma işlemi başarılı oldu ve HomePage sayfasına yönlendirildi.
            //HomePage sayfasında yer alan label'ın texti correcText değişkenine atandı.
            string correctText = BaseCollection.webDriver.FindElement(By.XPath("/html/body/div/div/div/h4")).Text;

            //Beklenen text ile gelen text karşılaştırıldı.
            Assert.AreEqual(correctText, LoginCollection.correctLoginVerifyText);
            Console.WriteLine("CorrectLoginTest başarıyla tamamlandı.");
        }


        //TestCleanup anatasyonu test kodu yürütüldükten sonra yapılacakları belirtmektedir.
        [TestCleanup]
        public void TearDown()
        {
            BaseCollection.webDriver.Quit();
            Console.WriteLine("Test otomasyonu sonlandırıldı...");
        }
    }
}

Test kodunu yazdıktan sonra Test Explorer’dan çalıştıralım. Sonuç aşağıdaki gibi olacaktır. Bu mantıkla diğer sayfalar için de test kodlarınızı yazabilirsiniz.

Test Sonucu

Faydalı olması dileğiyle…