🎯 Locators — Element Bulma Stratejileri
Locators — Element Bulma Stratejileri: Locator seçimi, Java'da bir koleksiyona erişim yöntemini seçmekle birebir örtüşür: By.id bir Map'te key ile lookup yapmak kadar hızlı (O(1)
Locator seçimi, Java'da bir koleksiyona erişim yöntemini seçmekle birebir örtüşür: By.id bir Map'te key ile lookup yapmak kadar hızlı (O(1)), By.xpath ise unsorted List'te değer aramak gibi — tüm DOM ağacını gezerek çalışır. Peki her sayfada id var gibi görünüyorken neden XPath veya CSS selector kullanmak gerekiyor? Çünkü front-end framework'leri (React, Angular) DOM'u yeniden render ettiğinde id'ler değişebilir ya da hiç olmayabilir; bu durumda XPath'teki `//button[normalize-space()='Satın Al']` gibi yapısal ilişki sorguları hayat kurtarır. Java'da By.id("loginBtn") yazıyordun; Python'da By.ID, TypeScript'te de aynı — sözdizimi değişir, strateji değişmez. QA açısından en tehlikeli locator tipi ise `By.className("btn")`: CSS class'lar tasarımcı tarafından refactor edildiğinde sessizce başka elementleri eşler, test yanlış PASS verir ve hiçbir exception fırlatmaz; bu, bulması en zor flaky test türüdür.
Locator Stratejileri Karşılaştırması
🎬 En Tehlikeli Locator: By.className'in Sessiz Tuzağı
"Satın Al" (class="btn")
Tasarımcı CSS'i refactor eder
"İptal Et" (class="btn")
Yanlış butona tıklandı
`By.className("btn")` — "Satın Al" butonunu bulur, tıklar, test GEÇER. Her şey mükemmel görünüyor.
Test yeşil kaldı, kimse şüphelenmedi — ama `By.className` HER ZAMAN ilk eşleşen elementi döndürür, sayfada aynı class'a sahip başka element OLMASA bile.
Haftalar sonra: bir tasarımcı stil tutarlılığı için "İptal Et" butonuna da `class="btn"` ekler — sayfanın görünümü değişmez, ama artık İKİ eleman aynı class'ı paylaşıyor.
`By.className("btn")` artık DOM sırasına göre "İptal Et" butonunu buluyor olabilir — hangisinin önce geldiği CSS'ten değil, HTML sırasından belirlenir.
Test AYNI kodu çalıştırır, AYNI şekilde tıklar — ama artık "Satın Al" yerine "İptal Et"e tıklıyor. Hiçbir exception YOK, çünkü element gerçekten bulundu ve gerçekten tıklanabilirdi.
Test raporunda: "PASSED". Ama gerçekte ödeme akışı test EDİLMEDİ — sipariş iptal edildi ve kimse fark etmedi. Bu, bulunması en zor flaky test türüdür: hata vermeyen, sessizce YANLIŞ çalışan test.
Final — Java köprüsü: `By.className` sınıf tipiyle değil AD'la eşleştirme yapan `instanceof` kontrolü gibidir; birden fazla sınıf aynı adı paylaşırsa yanlış nesneyi yakalarsın. Güvenli seçim: `By.id` veya `data-testid` — tasarımın ASLA dokunmayacağı bir kimlik.