Sayfa Nesne Modeli ve Fabrikası Selenium
⚡ Akıllı Özet
Sayfa Nesne Modeli ve Sayfa Fabrikası Selenium Sağlam ve sürdürülebilir test otomasyon çerçeveleri oluşturmak için yapılandırılmış bir tasarım deseni tanımlar. WebElement'leri ve davranışlarını kapsayan sayfaya özgü sınıflar oluşturmaya odaklanır, böylece tekrarlamayı azaltır ve okunabilirliği ve ölçeklenebilirliği artırır. Selenium komut dosyalarını test edin.

Sayfa Nesne Modeli (POM) nedir? Başlıca bileşenleri nelerdir?
Sayfa Nesne Modeli (POM) Web arayüzü öğeleri için bir Nesne Deposu oluşturan ve test otomasyonunda yaygın olarak kullanılan bir tasarım desenidir. Bu modelin avantajı, kod tekrarını azaltması ve test bakımını iyileştirmesidir.
Bu modelde, uygulamadaki her web sayfası için karşılık gelen bir Sayfa Sınıfı olmalıdır. Bu Sayfa sınıfı, o web sayfasının WebElement'lerini tanımlayacak ve ayrıca bu WebElement'ler üzerinde işlemler gerçekleştiren Sayfa yöntemlerini içerecektir. Bu yöntemlerin adları, gerçekleştirdikleri göreve göre verilmelidir; örneğin, bir yükleyici ödeme ağ geçidinin görünmesini bekliyorsa, POM yönteminin adı waitForPaymentScreenDisplay() olabilir.
Sayfa Nesne Modelinin Temel Bileşenleri
- Sayfa Sınıfları: Her web sayfasını ayrı bir sınıf olarak temsil edin.
- Konum belirleyiciler: Kimlikleri, XPath'leri veya CSS seçicilerini kullanarak web öğelerini tanımlayın.
- Yöntem: .page öğeleri üzerinde gerçekleştirilen eylemleri veya işlemleri içerir.
- Tekrar Kullanılabilirlik: PromoTestlerde kod tekrar kullanımı ve daha kolay bakım.
- Endişelerin Ayrılması: Sayfa yapısını test mantığından bağımsız tutarak daha iyi bir organizasyon sağlar.
Neden Sayfa Nesne Modeli?
Kullanıcı arayüzü otomasyonuna başlama Selenium Web Sürücüsü Bu zor bir iş değil. Sadece öğeleri bulmanız ve üzerlerinde işlemler gerçekleştirmeniz gerekiyor.
Bir web sitesine giriş yapmak için kullanılan bu basit komut dosyasını ele alalım.
Gördüğünüz gibi tek yaptığımız elemanları bulmak ve bu elemanların değerlerini doldurmak.
Bu, zaman alan ve hataya açık bir komut dosyasıdır. Başlangıçta kolay gibi görünse de, test paketi genişledikçe öğe değişikliklerini yönetmek zorlaşır. Ancak zamanla test paketi büyüyecektir. Kodunuza 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 bulan, dolduran veya doğrulayan ayrı bir sınıf dosyası oluşturmaktır. Bu sınıf daha sonra aynı öğeyle etkileşim kuran birden fazla test komut dosyasında yeniden kullanılabilir. Gelecekte, web öğesinde bir değişiklik olursa, 10 farklı komut dosyasında değil, yalnızca 1 sınıf dosyasında değişiklik yapmamız yeterli olur.
Bu yaklaşıma Sayfa Nesne Modeli adı verilmektedir. SeleniumBu, kodun daha okunabilir, bakımı kolay ve yeniden kullanılabilir olmasını sağlar.
👉 Ücretsiz Canlı Kayıt Olun Selenium Proje
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 avantaj ise nesne deposunun test senaryolarından bağımsız olmasıdır; bu sayede aynı nesne deposunu farklı araçlarla farklı amaçlar için kullanabiliriz. Örneğin, Sayfa Nesne Modelini entegre edebiliriz. Selenium 'da TestNG/JUnit işlevsellik için Test yapmak ve aynı zamanda JBehave/ ileCucumber kabul testi için.
- Code POM sınıflarındaki sayfa yöntemlerinin yeniden kullanılması sayesinde daha az karmaşık ve optimize edilmiş hale gelir.
- Metotlara, kullanıcı arayüzünde gerçekleşen işleme kolayca eşlenebilen daha gerçekçi isimler veriliyor. Örneğin, butona tıkladıktan sonra ana sayfaya yönlendirilirsek, metot adı 'gotoHomePage()' gibi olacaktır.
POM nasıl uygulanır? Selenium?
Sayfa Nesne Modeli çerçevesinin temel yapısında yer alan basit PLog, whereManagereIDElements'in bulunduğu yapıdadır. AUT Bu Web Öğeleri üzerinde çalışan yöntemler bir clog dosyasında saklanır. Doğrulama gibi bir görev, Test yöntemlerinin bir parçası olarak ayrı tutulmalıdır.
Tam Örnek
Test durumu: MyCAD'de yazılım Güncelleme ye git Guru99 Demo Sitesi.
Adım 1) Şuraya gidin: Guru99 Demo Sitesi
Adım 2) Ana sayfada, “Guru"99 Bank" mevcuttur.
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
Bu örnekte iki sayfayla ilgileniyoruz:
- 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 the 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 allows the test case to perform the login operation
* @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 içinde 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 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("manager id : mgr123"));
}
Page Factory nedir? Selenium?
Sayfa Fabrikası Selenium için dahili bir Sayfa Nesne Modeli çerçeve konseptidir. Selenium WebDriver, yürütme hızından ziyade ek açıklamalar kullanarak tekrarlayan öğe aramalarını azaltarak bakım kolaylığını artırır. Page nesnelerinin başlatılması veya Page nesnesinin kendisinin örneklendirilmesi için kullanılır. Ayrıca "FindElement/s" kullanılmadan Page sınıfı öğelerinin başlatılması 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 initElements yöntemini kullanıyoruz. Web öğelerini başlatmak için de bu yöntemi 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
Guru99 Page Factory ile 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 Sayfa (Page Factory ile)
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();
}
}
Guru99. Sayfa Fabrikası konseptiyle test senaryosu
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("manager id : mgr123"));
}
}
Komple Proje Yapısı şemaya benzeyecektir:
AjaxElement LocatorFabrika
AjaxElement LocatorFabrika PageFactory'nin tembel yükleme konseptidir SeleniumBu, web öğelerinin yalnızca herhangi bir işlemde kullanıldığında bulunmasını sağlamak için kullanılır. WebElements için sayfa sınıfı nesnesine bir zaman aşımı atar. PageFactory deseninin kullanılmasının en önemli avantajlarından biri de budur. Selenium AjaxElementLocatorFactory Sınıfıdır.
Burada, bir öğe üzerinde bir işlem gerçekleştirildiğinde, görünürlüğü için bekleme süresi yalnızca o andan itibaren başlar. Eğer öğe verilen zaman aralığında bulunamazsa, Test Durumu yürütme 'NoSuchElementException' istisnasını oluşturacaktır.
Örneğin:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Atomic Cüzdanı indirin : Selenium Bu Eğitimdeki Demoya İlişkin Proje Dosyaları











