📦 Page Object Model — Doğru Yapılışı

Page Object Model — Doğru Yapılışı: Page Object Model, Java'daki encapsulation ilkesinin test katmanına uygulanmasıdır: bir sınıf kendi iç implementasyonunu gizler ve dışarıya sa

Page Object Model, Java'daki encapsulation ilkesinin test katmanına uygulanmasıdır: bir sınıf kendi iç implementasyonunu gizler ve dışarıya sadece bir API (metod) seti sunar — tıpkı HashMap'in içinde nasıl çalıştığını bilmeden put() ve get() kullanman gibi. LoginPage sınıfı, "#email" locator'ının hangi attribute'a dayandığını, "Giriş Yap" butonunun DOM'da tam olarak nerede olduğunu gizler; test sadece loginPage.login("user@test.com", "pass123") çağırır. Peki neden test dosyasına locator'ı direkt yazmak yetmez? Frontend ekibi login formunu yeniden düzenlediğinde, locator test dosyasına dağılmışsa her test dosyasını taramak gerekir — Java'da bir private field'ın adını değiştirince IDE otomatik refactor yapsa da, Playwright test dosyalarına yayılmış string locator'ları IDE bulamaz. LoginPage sınıfı değiştirilince tüm testler otomatik güncellenir. QA gerçeği: "login flow değişti, 47 test kırmızı yandı" krizi genellikle POM uygulanmamış projelerde gerçekleşir; POM'un varlığında aynı değişiklik LoginPage.java'da (veya login-page.ts'de) tek bir locator güncellemesi demektir ve 47 test otomatik yeşile döner.

POM olmadan: 20 farklı test dosyasında aynı login locator'ları ve aynı login adımları kopyalanır. Login butonu "Giriş Yap" yerine "Oturum Aç" olarak değiştiğinde, 20 dosyayı tek tek düzeltmen gerekir. POM ile: locator ve login mantığı LoginPage sınıfında bir kere yazılır; buton metni değiştiğinde sadece o sınıfı güncellersin, tüm testler otomatik düzelir.

Bu, Selenium projelerinde yazdığın "Page Object" sınıflarıyla %100 aynı tasarım deseni — @FindBy ile alan tanımlayıp login() metodu yazdığın LoginPage class'ını hatırla. Playwright'ta @FindBy yerine constructor içinde page.getByRole(...) ile locator tanımlarsın; PageFactory.initElements() gibi ekstra bir başlatma adımına gerek yoktur, locator'lar "lazy" çalışır (gerçek arama, kullanıldığı anda olur).

Micro Lab: Playwright — Locator secimi

TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.

Adim Adim: Playwright — Locator secimi

Once getByRole, getByLabel, getByPlaceholder gibi semantic locator dene

Semantic bulamazsan getByText veya getByTestId kullan

CSS/XPath gerekiyorsa page.locator("css") veya page.locator("xpath=...") yaz

await expect(locator).toBeVisible() ile locatorin calistigini dogrula

Birden fazla element eslesiryorsa .first() / .nth() / .filter() ile daralt

Playwright locator secimi ve dogrulama sirasi nedir?

POM Olmadan vs POM ile

POM Yok — Kod Tekrarı