🗂️ JSON Locator Deposu

JSON Locator Deposu: JSON locator deposu, bir kütüphanenin kart kataloğudur: kitaplar (elementler) raflardadır, ama HANGİ kitabın HANGİ rafta olduğu bilgisi tek merkezi katalogta

JSON locator deposu, bir kütüphanenin kart kataloğudur: kitaplar (elementler) raflardadır, ama HANGİ kitabın HANGİ rafta olduğu bilgisi tek merkezi katalogta (locators.json) tutulur. Kitapların yeri değişince rafları tek tek gezmezsin — sadece katalog kartını güncellersin ve kataloğu kullanan HERKES otomatik doğru rafa gider. @FindBy'da bu bilgi kodun içine gömülüdür: locator değişince .java dosyasını değiştirir, yeniden derler ve deploy edersin. Peki @FindBy zaten Page Object'te merkezileştirme yapıyorken neden bir de JSON katmanına ihtiyaç olsun — fazladan dosya, fazladan okuma kodu, ne için? Şunun için: locator'ı KODDAN VERİYE dönüştürmek üç kapı açar — (1) derleme gerektirmeden düzeltme: UI'da bir id değişti, JSON'daki tek satırı düzeltirsin, jar'ı yeniden build etmezsin; (2) kod yazmayan ekip üyesi de locator güncelleyebilir; (3) aynı locator seti birden çok framework/araç tarafından okunabilir (Java + JS test projesi aynı JSON'u paylaşabilir). Java karşılaştırması: bu, hard-coded String yerine .properties/config dosyası kullanma kararının birebir aynısıdır — "hangi değerler koddan çıkarılıp konfigürasyona taşınmalı?" sorusunun locator versiyonu. QA bağlamındaki bedeli de dürüstçe bil: JSON'daki yazım hatasını derleyici YAKALAYAMAZ — @FindBy'da yanlış alan adı derleme hatasıdır, JSON'da yanlış anahtar runtime'da patlar. Bu yüzden depo sınıfın eksik anahtarda sessiz null değil, ANLAŞILIR mesajlı exception fırlatmalıdır — bu sekmedeki LocatorRepository tam bunu yapar.

📄 Adım 1: locators.json Yapısını Tasarla

İki seviyeli bir sözlük kullanıyoruz: sayfa adı → element adı → {type, value}. type alanı By stratejisinin adıdır (id, css, xpath, name...), value ise seçicinin kendisidir. Bu yapı bilinçli olarak DÜZ tutulur: iç içe 5 seviye klasörleşen "akıllı" şemalar okunabilirliği öldürür. Dosya src/test/resources altına konur — Maven bunu test classpath'ine otomatik dahil eder, böylece dosya yolu yerine classpath'ten okuruz ve testler CI dahil her makinede aynı şekilde çalışır.

Micro Lab: Locator stratejisi kurma

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

📦 Adım 2: LocatorDef POJO + Jackson ile Okuma

JSON'u Java'ya çevirmek için Jackson kullanıyoruz (pom.xml'e com.fasterxml.jackson.core:jackson-databind ekle). Hedef tip Map > — dıştaki Map sayfaları, içteki Map elementleri tutar. Jackson'ın generic Map'e deserialize edebilmesi için TypeReference gerekir: Java'nın tip silmesi (type erasure) yüzünden Map.class tek başına iç tipleri taşıyamaz — TypeReference anonim alt sınıfı, generic bilgiyi çalışma zamanına taşıyan standart Jackson çözümüdür.

Sayfa+Element Anahtarıyla Locator Bulma

LocatorRepository.get("loginPage", "usernameInput") — iki anahtarla arama başlar.

Dış Map: sayfa aranır

"loginPage" anahtarı dış Map'te aranır; bulunamazsa mevcut sayfaları listeleyen bir hata fırlar.

İç Map: element aranır

"usernameInput" anahtarı o sayfanın iç Map'inde aranır; bulunamazsa mevcut elementleri listeler.

By nesnesine çevrilir