C# NUnit ile Selenium Web Driver POM Kullanımı

Bu yazımda sizlere C# programlama dilinde NUnit test kütüphanesini kullanarak web uygulamalarını Selenium Web Driver POM yaklaşımı ile nasıl test edebileceğinizi anlatacağım.

Kullanılacak Kütüphanelerin Proje Dahil Edilmesi

Visual Studio’da Class Library (.NET Framework) projesi oluşturuyoruz. NUnit, Selenium WebDriver ve Google Chrome tarayıcılarına ait referansları Manage NuGet Packages ile projemize dahil ediyoruz. Installed kısmı aşağıdaki olmalıdır.

Manage NuGet Packages

Solution Explorer bölümünde projemizin altına Collections, Pages ve Tests adında 3 adet klasör oluşturuyoruz. Klasör isimlerini siz anlayacağınız şekilde adlandırabilirsiniz. Collections klasörüne BaseCollection.cs adında bir sınıf oluşturuyoruz ve IWebDriver türünde bir property tanımlıyoruz.

using OpenQA.Selenium;
namespace DemoLoginNUnitPOM.Collections
{
    public class BaseCollection
    {
        public static IWebDriver webDriver { get; set; }
    }
}

BaseCollection sınıfından sonra login sayfamız için yine Collections klasöründe LoginPageCollection.cs adında bir sınıf oluşturuyoruz. Bu sınıfta login sayfamıza ait başlık, url ve ekranda kullanılan hata, uyarı mesajlarını static olarak tanımlıyoruz. Kod bloğu aşağıdaki gibi olacaktır.

namespace DemoLoginNUnitPOM.Collections
namespace DemoLoginNUnitPOM.Collections
{
    public class LoginPageCollection
    {
        public static string loginPageUrl = "http://localhost:8383/DemoLogin/index.html";
        public static string loginPageTitle = "Login Page";

        public static string correctUserName = "admin";
        public static string correctPassword = "123456";

        public static string incorrectUserName = "test";
        public static string incorrectPassword = "12345";
    }
}

Collection sınıflarını tanımladıktan sonra sırada Pages klasörüne LoginPage.cs adında bir sınıf oluşturuyoruz bu sınıfta login sayfasında kullanacağımız ekran bileşenleri ve oturum açma methodunu tanımlıyor olacağız. LoginPage.cs sınıfına ait kod bloğu aşağıdaki gibi olacaktır.

using DemoLoginNUnitPOM.Collections;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.PageObjects;

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

        //Ekran Bileşenleri
        [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; }


        //Oturum Açma Methodu
        public void SignIn(string kullaniciAdi, string parola)
        {
            txtKullaniciAdi.SendKeys(kullaniciAdi);
            txtParola.SendKeys(parola);
            btnGirisYap.Click();
        }
    }
}

Hemen ardından Tests klasöründe BaseTest.cs adında bir sınıf oluşturuyoruz. BaseCollection sınıfında tanımladığımız property’i kullanmak için BaseTest sınıfını BaseCollection sınıfından inherit ediyoruz. [OneTimeSetup] ile test çalışmadan önce bu methodun çalışması gerektiğini söylüyoruz. Aynı şekilde [OneTimeTearDown] ile de test bitmeden hemen önce bu methodun çalışması gerektiğini söylemiş oluyoruz.

[OneTimeSetUp] ile [SetUp] etiketleri arasındaki farkı bir örnekle anlatmak gerekirse iki adet test methodunuzun olduğunu düşünün. Run All komutu vererek iki test methodunuda çalıştıracaksınız. [SetUp] etiketini kullandığınızda ilk test methodu için bir webdriver nesnesi yaratılır ve bir tarayıcı penceresi açılır test methodu çalıştıktan sonra [TearDown] etiketine girerek test methodu tamamlanır ve tarayıcı penceresi kapanır. İkinci test methodu için aynı işlemler tekrarlanır. Yani her test methodu için yeni bir tarayıcı penceresi açılmış olur. [OneTimeSetUp] etiketi kullandığınız zaman tüm test methodları tek tarayıcı da çalışır ve test bitirilir.

using DemoLoginNUnitPOM.Collections;
using NUnit.Framework;
using OpenQA.Selenium.Chrome;

namespace DemoLoginNUnitPOM.Tests
{
    public class BaseTest : BaseCollection
    {
        [OneTimeSetUp]
        public void Open()
        {
            webDriver = new ChromeDriver();
            webDriver.Manage().Window.Maximize();
        }

        [OneTimeTearDown]
        public void Close()
        {
            webDriver.Quit();
        }

        public static void GotoUrl(string url)
        {
            webDriver.Navigate().GoToUrl(url);
        }
    }
}

BaseTest.cs sınıfını oluşturduktan sonra login sayfasının test methodlarını yazacağımız LoginPageTest.cs sınıfını yine Tests klasörüne oluşturuyoruz. [Test, Category(” “)] etiketi ile test senaryolanızı kategorilere ayırabilirsiniz. Ayrıca Description etiketi ile de test senaryosu hakkında açıklayıcı bilgiler yazabilirsiniz.

using DemoLoginNUnitPOM.Collections;
using DemoLoginNUnitPOM.Pages;
using NUnit.Framework;

namespace DemoLoginNUnitPOM.Tests
{
    [TestFixture]
    public class LoginPageTest : BaseTest
    {
        public void SignIn(string username, string password)
        {
            GotoUrl(LoginPageCollection.loginPageUrl);
            LoginPage loginPage = new LoginPage();
            loginPage.SignIn(username, password);
        }

        [Test, Category("Fonksiyonel Test"), Description("Başarılı Oturum Açma Senaryosu")]
        public void CorrectLoginTest()
        {

            SignIn(LoginPageCollection.correctUserName, LoginPageCollection.correctPassword);
            Assert.AreEqual(LoginPageCollection.loginPageTitle, webDriver.Title);
        }

        [Test, Category("Fonksiyonel Test"), Description("Başarısız Oturum Açma Senaryosu")]
        public void IncorrectLoginTest()
        {
            SignIn(LoginPageCollection.incorrectUserName, LoginPageCollection.incorrectPassword);
            Assert.AreEqual(LoginPageCollection.loginPageTitle, webDriver.Title);
        }
    }
}

Yazdığımız test kodunu Test Explorer ekranında çalıştırdığımızda oturum açma senaryolarının çalıştığını görebilirsiniz. Test senaryolarını kategorilere göre gruplamak için Traits seçeneğini seçmeniz gerekmektedir.

Test Explorer

Faydalı olması dileğiyle…