Sayfa Nesne Modeli ve Fabrikası Selenium
Sayfa Nesne Modeli Nedir?
Sayfa Nesne Modeli (POM) web kullanıcı arayüzü öğeleri için Nesne Deposu oluşturan, test otomasyonunda yaygın olarak kullanılan bir tasarım desenidir. Modelin avantajı kod tekrarını azaltması ve test bakımını iyileştirmesidir.
Bu modele göre uygulamadaki her web sayfasına karşılık gelen bir Sayfa Sınıfı bulunmalıdır. Bu Page sınıfı, söz konusu web sayfasının WebElements'ini tanımlayacak ve aynı zamanda bu WebElements üzerinde işlemleri gerçekleştiren Page yöntemlerini de içerecektir. Bu yöntemlerin adı, gerçekleştirdikleri göreve göre verilmelidir; örneğin, bir yükleyici ödeme ağ geçidinin görünmesini bekliyorsa, POM yöntem adı waitForPaymentScreenDisplay() olabilir.
Neden Sayfa Nesne Modeli?
Bir UI Otomasyonunu Başlatma Selenium WebDriver zor bir görev DEĞİLDİR. Sadece öğeleri bulmanız, üzerinde işlemler gerçekleştirmeniz gerekir.
Bir web sitesine giriş yapmak için bu basit komut dosyasını düşünün
Gördüğünüz gibi tek yaptığımız elemanları bulmak ve bu elemanların değerlerini doldurmak.
Bu küçük bir komut dosyasıdır. Komut dosyası bakımı kolay görünüyor. Ancak zamanla test paketi büyüyecektir. Kodunuza giderek daha fazla satır ekledikçe işler zorlaşır.
Komut dosyası bakımıyla ilgili temel sorun, eğer 10 farklı komut dosyası aynı sayfa öğesini kullanıyorsa, o öğede herhangi bir değişiklik olduğunda, 10 komut dosyasının tamamını da değiştirmeniz gerekmesidir. Bu zaman alıcıdır ve hataya açıktır.
Komut dosyası bakımına daha iyi bir yaklaşım, web öğelerini bulacak, dolduracak veya doğrulayacak ayrı bir sınıf dosyası oluşturmaktır. Bu sınıf, o öğeyi kullanan tüm komut dosyalarında yeniden kullanılabilir. Gelecekte web elementinde bir değişiklik olursa, değişikliği 1 farklı scriptte değil, sadece 10 class dosyasında yapmamız gerekecek.
Bu yaklaşıma Sayfa Nesne Modeli adı verilmektedir. SeleniumKodun daha okunabilir, sürdürülebilir ve yeniden kullanılabilir olmasına yardımcı olur.
POM'un avantajları
- Sayfa Nesnesi Tasarım Modeli, kullanıcı arayüzündeki işlem ve akışların doğrulamadan ayrılması gerektiğini söylüyor. Bu kavram, kodumuzu daha temiz ve anlaşılması kolay hale getirir.
- İkinci fayda, nesne deposunun test senaryolarından bağımsız olmasıdır, dolayısıyla aynı nesne deposunu farklı araçlarla farklı bir amaç için kullanabiliriz. Örneğin, Sayfa Nesne Modelini şuraya entegre edebiliriz: Selenium ile TestNG/JUnit işlevsellik için Test yapmak ve aynı zamanda JBehave/ ileCucumber kabul testi için.
- POM sınıflarındaki yeniden kullanılabilir sayfa yöntemleri nedeniyle kod azalır ve optimize edilir.
- Yöntemler, kullanıcı arayüzünde gerçekleşen işlemlerle kolayca eşlenebilecek daha gerçekçi adlar alır. yani butona tıkladıktan sonra ana sayfaya ulaşırsak, yöntem adı 'gotoHomePage()' gibi olacaktır.
POM nasıl uygulanır?
Basit POM:
Sayfa nesne modeli çerçevesinin temel yapısıdır ve bu yapıdaki tüm Web Öğeleri AUT ve bu Web Öğeleri üzerinde çalışan yöntemler bir sınıf dosyası içinde tutulur. Doğrulama gibi bir görev, Test yöntemlerinin bir parçası olarak ayrı olmalıdır.
Tam Örnek
Test durumu: Guru99 Demo Sitesine gidin.
Adım 1) Guru99 Demo Sitesine gidin
Adım 2) Ana sayfada “Guru99 Bank” metninin mevcut olup olmadığını kontrol edin
Adım 3) Uygulamaya giriş yapın
Adım 4) Ana sayfanın "Yönetici Kimliği: demo" şeklinde bir metin içerdiğini doğrulayın
İşte 2 sayfayla uğraşıyoruz
- Sayfa Giriş
- Ana Sayfa (giriş yaptığınızda gösterilir)
Buna göre 2 POM oluşturuyoruz. Selenium sınıflar
Guru99 Giriş sayfası POM
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class Guru99Login { WebDriver driver; By user99GuruName = By.name("uid"); By password99Guru = By.name("password"); By titleText =By.className("barone"); By login = By.name("btnLogin"); public Guru99Login(WebDriver driver){ this.driver = driver; } //Set user name in textbox public void setUserName(String strUserName){ driver.findElement(user99GuruName).sendKeys(strUserName); } //Set password in password textbox public void setPassword(String strPassword){ driver.findElement(password99Guru).sendKeys(strPassword); } //Click on login button public void clickLogin(){ driver.findElement(login).click(); } //Get the title of Login Page public String getLoginTitle(){ return driver.findElement(titleText).getText(); } /** * This POM method will be exposed in test case to login in the application * @param strUserName * @param strPasword * @return */ public void loginToGuru99(String strUserName,String strPasword){ //Fill user name this.setUserName(strUserName); //Fill password this.setPassword(strPasword); //Click Login button this.clickLogin(); } }
Guru99 Ana Sayfa POM in Selenium
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class Guru99HomePage { WebDriver driver; By homePageUserName = By.xpath("//table//tr[@class='heading3']"); public Guru99HomePage(WebDriver driver){ this.driver = driver; } //Get the User name from Home Page public String getHomePageDashboardUserName(){ return driver.findElement(homePageUserName).getText(); } }
Guru99 Basit POM girişi Selenium Test durumu
package test; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import pages.Guru99HomePage; import pages.Guru99Login; public class Test99GuruLogin { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; Guru99Login objLogin; Guru99HomePage objHomePage; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://demo.guru99.com/V4/"); } /** * This test case will login in https://demo.guru99.com/V4/ * Verify login page title as guru99 bank * Login to application * Verify the home page using Dashboard message */ @Test(priority=0) public void test_Home_Page_Appear_Correct(){ //Create Login Page object objLogin = new Guru99Login(driver); //Verify login page title String loginPageTitle = objLogin.getLoginTitle(); Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank")); //login to application objLogin.loginToGuru99("mgr123", "mgr!23"); // go the next page objHomePage = new Guru99HomePage(driver); //Verify home page Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mgr123")); }
Page Factory nedir? Selenium?
Sayfa Fabrikası Selenium için dahili bir Sayfa Nesne Modeli çerçeve konseptidir. Selenium WebDriver ama çok optimize edilmiş. Page nesnelerinin başlatılması veya Page nesnesinin kendisinin başlatılması için kullanılır. Ayrıca Page sınıfı öğelerini "FindElement/s" kullanmadan başlatmak için de kullanılır.
Burada da Sayfa Nesnesi Havuzu ve Test Yöntemlerinin ayrılması kavramını takip ediyoruz. Ayrıca PageFactory sınıfının yardımıyla Selenium, ek açıklamalar kullanıyoruz @FindBy WebElement'i bulmak için. Web öğelerini başlatmak için initElements yöntemini kullanıyoruz
@FindBy kabul edilebilir tagName, kısmiLinkText, ad, linkText, kimlik, css, className, xpath nitelikler olarak.
Yukarıdakiyle aynı örneğe Page Factory'yi kullanarak bakalım
Page Factory ile Guru99 Giriş sayfası
package PageFactory; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class Guru99Login { /** * All WebElements are identified by @FindBy annotation */ WebDriver driver; @FindBy(name="uid") WebElement user99GuruName; @FindBy(name="password") WebElement password99Guru; @FindBy(className="barone") WebElement titleText; @FindBy(name="btnLogin") WebElement login; public Guru99Login(WebDriver driver){ this.driver = driver; //This initElements method will create all WebElements PageFactory.initElements(driver, this); } //Set user name in textbox public void setUserName(String strUserName){ user99GuruName.sendKeys(strUserName); } //Set password in password textbox public void setPassword(String strPassword){ password99Guru.sendKeys(strPassword); } //Click on login button public void clickLogin(){ login.click(); } //Get the title of Login Page public String getLoginTitle(){ return titleText.getText(); } /** * This POM method will be exposed in test case to login in the application * @param strUserName * @param strPasword * @return */ public void loginToGuru99(String strUserName,String strPasword){ //Fill user name this.setUserName(strUserName); //Fill password this.setPassword(strPasword); //Click Login button this.clickLogin(); } }
Guru99 Ana Sayfası ve Sayfa Fabrikası
package PageFactory; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class Guru99HomePage { WebDriver driver; @FindBy(xpath="//table//tr[@class='heading3']") WebElement homePageUserName; public Guru99HomePage(WebDriver driver){ this.driver = driver; //This initElements method will create all WebElements PageFactory.initElements(driver, this); } //Get the User name from Home Page public String getHomePageDashboardUserName(){ return homePageUserName.getText(); } }
Page Factory konseptine sahip Guru99 TestCase
package test; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import PageFactory.Guru99HomePage; import PageFactory.Guru99Login; public class Test99GuruLoginWithPageFactory { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; Guru99Login objLogin; Guru99HomePage objHomePage; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://demo.guru99.com/V4/"); } /** * This test go to https://demo.guru99.com/V4/ * Verify login page title as guru99 bank * Login to application * Verify the home page using Dashboard message */ @Test(priority=0) public void test_Home_Page_Appear_Correct(){ //Create Login Page object objLogin = new Guru99Login(driver); //Verify login page title String loginPageTitle = objLogin.getLoginTitle(); Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank")); //login to application objLogin.loginToGuru99("mgr123", "mgr!23"); // go the next page objHomePage = new Guru99HomePage(driver); //Verify home page Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mgr123")); } }
Komple Proje Yapısı şemaya benzeyecektir:
AjaxElement LocatorFabrika
AjaxElement LocatorFabrika PageFactory'nin tembel yükleme konseptidir Selenium. Web öğelerini yalnızca öğeler herhangi bir işlemde kullanıldığında bulmak için kullanılır. Nesne sayfa sınıfına WebElements için bir zaman aşımı atar. PageFactory desenini kullanmanın temel avantajlarından biri Selenium AjaxElementLocatorFactory Sınıfıdır.
Burada bir eleman üzerinde işlem yapıldığında onun görünürlüğü için bekleme süresi ancak o andan itibaren başlar. Eleman verilen zaman aralığında bulunamazsa, Test Durumu yürütme 'NoSuchElementException' istisnasını oluşturacaktır.
ÖZET
- Sayfa Nesne Modeli Selenium WebDriver bir Nesne Havuzu tasarım modelidir.
- Selenium sayfa nesnesi modeli, test kodumuzu bakımı kolay ve yeniden kullanılabilir hale getirir.
- Page Factory, Sayfa Nesne Modeli çerçeve konseptinde nesne deposu oluşturmanın optimize edilmiş bir yoludur.
- AjaxElementLocatorFactory, Page Factory'deki bir tembel yük konseptidir - WebElements'i yalnızca herhangi bir işlemde kullanıldığında tanımlamak için sayfa nesnesi tasarım modeli.
Atomic Cüzdanı indirin : Selenium Bu Eğitimdeki Demoya İlişkin Proje Dosyaları