Selenium Senaryo Yazımı Hazırlık Süreci(XUnit-.NetCore)
Merhaba,
Bu yazımda, test senaryolarını oluşturmak için gereken hazırlık sürecini anlatmayı hedefliyorum. Yazının sonunda, config dosyasına sahip, UI elementlerini tutan, sizlerle beraber hazırladığımız senaryoları eklediğimiz bir projemiz olacak. Başlamadan, selenium ile test projesi yazmak için gereklilikleri tamamlamak adına önceki yazılarıma göz atmanızı öneririm:
Yapılacaklar:
- UI elementleri tanımlama
- Config class’ını yazma
- Genel Metot ve Aksiyonları tutacağımız class’ı yazma
1. UI Elementleri Tanımlama
Bu kısımda, senaryomuzda gerekli olacak tüm elementleri tanımlamak için bir class yazacağız. Web sitesi arayüzündeki elementler için POM tasarım modelini kullanacağız. Bu tasarım modeli ile karışık ve tekrar eden kodların yazılması önlenecektir. Selenium’daki PageFactory sınıfını kullanarak Web Elementlerini bulacağız. Böylece daha sonra yazacağımız senaryolarda bu elementleri tek bir yerden çağırmaya olanak sağlamış olacağız.
Peki PageFactory nasıl kullanılır?
Web elementini tanımlamak için @FindBy annotation’u kullanılır. How kullanımı ile o elementi hangi konum belirleyici ile bulduracağımız belirtilir. IWebElement elementName kalıbı elementi nasıl isimlendirdiğimizi belirtir.
Öncelikle tüm UI Elementlerimizi tutacağımız bir klasör oluşturacağız.(Solution Explorer içindeki Proje üzerine sağ tık>Add>New Folder>klasör adı) Daha sonra da bu klasörün içine ilgili sayfadaki elementleri tutacağımız class’ı oluşturup içini dolduracağız.(Klasör üzerine sağ tık>Add>New Item>Class>class adı)
- Oluşturulan class, public class olmalıdır.
- Constructor oluşturulmalı ve içerisine PageFactory.InitElements eklenmelidir. Pagefactory yaklaşımıyla sayfa yüklenir yüklenmez tüm elementler initElements() ile başlatılır.
ctor tab tuşu(x2), constructor kısa yoludur.
public LoginPageUIElements(IWebDriver driver)
{
PageFactory.InitElements(driver, this);
}
LoginPageUIElements Kodları;
using OpenQA.Selenium;
using SeleniumExtras.PageObjects;
namespace MediumTestOtomasyon.MediumProjectUIElements
{
public class LoginPageUIElements //public class yapılmalıdır.
{
public LoginPageUIElements(IWebDriver driver)
{
PageFactory.InitElements(driver, this); //InitElements, sayfa yüklenir yüklenmez sayfadaki tüm öğelerini başlatır.
}
[FindsBy(How = How.Id, Using = "UserName")] //hangi konum belirleyici ile bulunacağı belirtilir.
public IWebElement Username { get; set; } //Username ismi ile senaryolardan çağrılabilecek.
[FindsBy(How = How.Name, Using = "Password")]
public IWebElement Password { get; set; }
[FindsBy(How = How.Id, Using = "ys-fastlogin-button")]
public IWebElement LoginBtn { get; set; }
[FindsBy(How = How.LinkText, Using = "Yeni Üyelik!")]
public IWebElement NewAccount { get; set; }
[FindsBy(How = How.CssSelector, Using = "#ys-fastlogin-button")]
public IWebElement LoginBtnWithCSSPath { get; set; }
[FindsBy(How = How.XPath, Using = "//*[@id='ys-fastlogin-button']")]
public IWebElement LoginBtnWithXPath { get; set; }
[FindsBy(How = How.XPath, Using = "//a[@href ='/sifremi-unuttum']")]
public IWebElement ResetPassword { get; set; } [FindsBy(How=How.CssSelector, Using = "#login-form > div.form-group.has-error > div > small")] //Lütfen şifrenizi giriniz uyarısı
public IWebElement PleaseEnterPasswordInfo { get; set; } [FindsBy(How = How.XPath, Using = "/html/body/div[9]")] //Hatalı kullanıcı uyarısı
public IWebElement InvalidUserInfo { get; set; }
[FindsBy(How = How.CssSelector, Using = @"body > div.ReactModalPortal > div > div")] //Login sonrası açılan mahalle,banabi seçim popup
public IWebElement AfterLoginPopup { get; set; } }
}
2. Config Class’ını Yazma
Bu kısımda sıklıkla kullanmamız gereken ama kod tekrar etmekten de kaçınacağımız tüm ayarlamaları ve bilgileri tanımlamak için bir class yazacağız. Bu class içinde url, test için kullanacağımız username, password gibi metinler, ortak dosya uzantıları gibi bilgileri tutabiliriz.
Proje içerisine BaseConfig isimli bir class oluşturalım. Bu class public static class olmalıdır. Oluşturduğumuz class içinde Url ve kullanıcı bilgilerini tutacağız. Geçerli, geçersiz kullanıcı, null kullanıcı gibi seçenekleri de bu alanda belirteceğiz.
BaseConfig Kodları;
namespace MediumTestOtomasyon
{
public static class BaseConfig
{
public static string MediumTestUrl = "https://www.yemeksepeti.com/istanbul";
public static class Credentials //Kullanıcıya ait her şeyi bir arada tutacaktır.
{
public static string InvalidUsername = "Otomasyon"; //geçersiz kullanıcı
public static string InvalidPassword = "123456";
public static string ValidUsername = "Gerçerli Kullanıcı adı"; //geçerli kullanıcı bilgileri
public static string ValidPassword = "Geçerli Şifre";
public static string EmptyUsername = " "; //boş girilme durumu için
public static string EmptyPassword = " ";
}
}
}
3. Genel Metot ve Aksiyon Class’ı Yazma
Bu kısımda başlıktan da anlaşılacağı gibi senaryolarımızda kullanacağımız ortak metotları, alınacak aksiyonları yazacağız. Driver’ı başlatıp, testi koşacağımız web sitesinin Url’ine girecek metodu ve user bilgilerini dolduracak metodu yazacağız. Bu class içerisinde ekran görüntüsü alacak, dosya indirecek, elementler bulunana kadar bekleyecek metotları da yazabiliriz. Sonraki yazılarımda bu metotları açıklayacağım.
Proje içerisine BaseActions isimli bir class oluşturalım. Bu class public static class olmalıdır. InitializedDriver ve LoginWithTheUsernameAndPassword isimli metotlar ile ilerde test senaryoları yazarken driver başlatılmasına ve input alanların doldurulmasına kod tekrarına gerek kalmadan çözüm bulmuş oluyoruz.
BaseActions Kodları;
using MediumTestOtomasyon.MediumProjectUIElements;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Threading;
namespace MediumTestOtomasyon
{
public static class BaseActions
{
public static IWebDriver InitializedDriver()
{
ChromeOptions options = new ChromeOptions();
IWebDriver driver = new ChromeDriver(options);
driver.Navigate().GoToUrl(BaseConfig.MediumTestUrl); // Config sınıfında tanımlı URL kullanıldı.
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5); // 5sn bekleme konuldu.
driver.Manage().Window.Maximize(); //Chrome ekranı maxiumum boyuta getirildi.
return driver;
}
public static void LoginWithTheUsernameAndPassword(IWebDriver driver, string username, string password)
{
LoginPageUIElements loginPage = new LoginPageUIElements(driver);
loginPage.Username.SendKeys(username);
loginPage.Password.SendKeys(password);
loginPage.LoginBtn.Click();
Thread.Sleep(5000); // 5sn bekleme konuldu.
}
}
}
Umarım size test otomasyonu serüveninizde yardımcı olabilmişimdir. Bu yazının devam yazısında başarılı ve başarısız login test senaryosunu anlatacağım. Devamında görüşürüz :)
Sağlıcakla kalın…