Page Object Model (POM)
Page Object Model (POM), test otomasyon projelerinde kullanılan bir tasarım deseni (design pattern)’dir.
Amacı, kod tekrarını azaltmak, bakımı kolaylaştırmak ve testlerin okunabilirliğini artırmaktır.
Bu modelde, her web sayfası için ayrı bir Java sınıfı (class) oluşturulur.
Bu sınıf, o sayfadaki elementleri (WebElement) ve bu elementlerle etkileşim kuran metodları içerir.
🎯 POM’un Avantajları
Section titled “🎯 POM’un Avantajları”- Kod Tekrarını Azaltır: Ortak işlemler tek bir yerde tanımlanır.
- Bakımı Kolaylaştırır: Sayfa değiştiğinde sadece ilgili
Pagesınıfı güncellenir. - Okunabilirliği Artırır: Test senaryoları iş akışına benzer şekilde yazılır.
- Test ve Sayfa Kodlarını Ayrıştırır: Test mantığı ile UI detayları ayrı tutulur.
📁 Klasör Yapısı Örneği
Section titled “📁 Klasör Yapısı Örneği”src └── test ├── java │ ├── pages │ │ ├── LoginPage.java │ │ └── HomePage.java │ └── tests │ ├── LoginTest.java │ └── resources └── config.properties🧩 Örnek: Login Sayfası (Page Sınıfı)
Section titled “🧩 Örnek: Login Sayfası (Page Sınıfı)”package pages;
import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.support.FindBy;import org.openqa.selenium.support.PageFactory;
public class LoginPage {
WebDriver driver;
// Constructor: PageFactory ile elementleri başlatır public LoginPage(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }
// Web elementler @FindBy(id = "username") WebElement usernameInput;
@FindBy(id = "password") WebElement passwordInput;
@FindBy(id = "loginBtn") WebElement loginButton;
// Sayfa işlemleri (Actions) public void setUsername(String username) { usernameInput.sendKeys(username); }
public void setPassword(String password) { passwordInput.sendKeys(password); }
public void clickLoginButton() { loginButton.click(); }
// Kombine metod: Tüm login işlemini yapan tek fonksiyon public void login(String username, String password) { setUsername(username); setPassword(password); clickLoginButton(); }}🧪 Örnek: Test Sınıfı
Section titled “🧪 Örnek: Test Sınıfı”package tests;
import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.*;import pages.LoginPage;
public class LoginTest {
WebDriver driver; LoginPage loginPage;
@BeforeClass public void setUp() { driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get("https://example.com/login"); loginPage = new LoginPage(driver); }
@Test public void validLoginTest() { loginPage.login("testuser", "password123"); // Doğrulama: Başarılı giriş sonrası kontrol yapılabilir }
@AfterClass public void tearDown() { driver.quit(); }}⚙️ PageFactory Nedir?
Section titled “⚙️ PageFactory Nedir?”PageFactory, Selenium’un sağladığı bir yardımcı sınıftır.
Sayfa nesnelerini (WebElement) @FindBy anotasyonu ile tanımlayıp kolayca başlatmamızı sağlar.
PageFactory.initElements(driver, this);Bu yöntem, driver.findElement() kullanımını ortadan kaldırarak daha temiz bir yapı sunar.
💡 İleri Seviye Öneriler
Section titled “💡 İleri Seviye Öneriler”- BasePage.java oluşturun → Ortak metodları (click, wait, getText vs.) burada toplayın.
- BaseTest.java oluşturun → Setup/teardown işlemlerini burada yönetin.
- Config.properties dosyası ile URL, kullanıcı adı, şifre gibi verileri dışa alın.
- Test çerçevesi olarak TestNG veya JUnit tercih edin.
📘 Örnek BasePage.java
Section titled “📘 Örnek BasePage.java”package pages;
import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;
public class BasePage {
WebDriver driver;
public BasePage(WebDriver driver) { this.driver = driver; }
public void click(WebElement element) { element.click(); }
public void type(WebElement element, String text) { element.sendKeys(text); }
public String getTitle() { return driver.getTitle(); }}🧱 Sonuç
Section titled “🧱 Sonuç”POM yapısı, testlerin sürdürülebilirliğini ve proje ölçeklenebilirliğini büyük ölçüde artırır.
Her sayfa kendi sınıfında yönetildiği için, değişiklik durumlarında testlerin büyük kısmı etkilenmeden çalışmaya devam eder.