Ana içeriğe geç

Kendini Onaran Locator'lar

Bir locator — bir sınıf yeniden adlandırıldığı, bir id taşındığı veya işaretleme yeniden düzenlendiği için — eşleşmeyi bıraktığında, framework testi başarısız etmek yerine orijinal locator'ınızdan türetilen alternatif stratejilerle otomatik olarak yeniden deneyebilir. Her onarım kaydedilir; böylece seçiciyi kendi hızınızda sonradan düzeltebilirsiniz.

Kendini onarma isteğe bağlıdır ve şeffaftır: test, locator çalışmışcasına devam eder ve HTML raporunda bir ⚠ healed rozeti görünür.


Etkinleştirme​

Varsayılan olarak kapalıdır. testfly.yml içinde açın:

locators:
selfHealing: true

Nasıl çalışır​

Kendini onarma, WaitEngine içine bağlanır. waitForVisible(...) veya waitForClickable(...) zaman aşımına uğradığında (TimeoutException / NoSuchElementException), framework başarısız olan By tanımını ayrıştırır, sıralı bir geri dönüş locator listesi türetir ve bulunan ve görünür ilk öğeyi döndürür. Hiçbiri eşleşmezse, orijinal istisna yeniden fırlatılır — kendini onarma, gerçekten eksik olan bir öğeyi asla gizlemez.

Onarma yalnızca zincir filtresi olmayan düz bir find(By...) veya find("...") locator'ı için denenir. Semantik locator'lar (getByRole, getByText ve diğer getBy* metotları) ile filter, withText, within, nth, withName veya last kullanılarak daraltılan locator'lar uygun değildir; çünkü onarma temel seçicinin tamamını değiştirir. Uygun BasePage eylemleri ve doğrudan WaitEngine çağrıları ayrı bir onarma API'si gerektirmez.

Geri dönüş stratejileri​

Geri dönüşler orijinal locator'ın kendi içeriğinden türetilir — framework asla havadan seçici uydurmaz. Stratejiler şu sırayla denenir:

#StratejiNereden türetilirNe ile yeniden dener
1id-from-css / id-from-xpathCSS #foo veya XPath @id='foo'By.id
2name-from-css / name-from-xpathCSS [name='foo'] veya XPath @name='foo'By.name
3exact-text-from-xpath / contains-text-from-xpathXPath text()='foo' / contains(text(),'foo')XPath metin eşleşmesi
4class-from-cssBileşik bir CSS seçicisinin son .className parçasıBy.className
5data-testid-from-cssCSS [data-testid='foo']By.cssSelector
6placeholder-from-cssCSS [placeholder='foo']By.cssSelector

Örnek. Artık eşleşmeyen By.cssSelector("div.header input#email") locator'ı By.id("email")'e, ardından By.className("header")'e geri döner — böylece id hâlâ mevcut olduğu sürece bir sarmalayıcı yeniden adlandırması testi bozmaz.

Seviye 1.5: Fuzzy Self-Healing (FuzzyHealingEngine)​

Statik kurallar başarısız olduğunda TestFly, harici LLM'e gitmeden önce yerel FuzzyHealingEngine'i devreye alır:

  • ID, isim ve CSS parçalarından seçici ipuçlarını (clues) ayıklar.
  • DOM'daki aday öğeler üzerinde yerel ve sıfır-token Levenshtein mesafe analizi yapar.
  • Yeniden adlandırılan veya ufak yazım hataları içeren seçicileri harici AI çağrısı olmadan onarır. Çalışma süresi DOM boyutuna bağlıdır ve garanti edilmez.

Seviye 2: Yapay Zeka Destekli Onarma (aiHealing: true)​

Statik ve fuzzy stratejilerin yetersiz kaldığı durumlarda locators.aiHealing: true aktifse AiHealingEngine devreye girer:

  • Sayfa DOM'unu budayarak yapılandırılmış token bütçesine sığdırır.
  • LLM'den başarısız olan seçicinin amacına uygun yeni bir locator üretmesini talep eder.
  • Üretilen seçiciyi canlı sayfada doğrular ve .testfly/healed-locators.json dosyasına önbelleğe alır; sonraki koşumlar yeni bir AI çağrısından kaçınabilir ancak normal locator çözümleme yine zaman alır.

Neyin onarıldığını görme​

Her onarım, testi, orijinal locator'ı, çalışan locator'ı ve kullanılan stratejiyi yakalayan bir HealEvent üretir. Bunları incelemek için iki yol vardır.

HTML rapor rozeti​

En az bir locator'ı onaran her test, HTML raporunda adının yanında bir ⚠ healed rozetiyle işaretlenir. O testte otomatik olarak onarılan locator sayısı için üzerine gelin.

target/healed-locators.json​

Suite sonunda tam onarım logu target/healed-locators.json dosyasına dışa aktarılır — her onarım için orijinal locator, onarılmış locator, strateji ve bir zaman damgası içeren bir kayıt. Bu dosyayı düzeltilecek kırılgan seçicilerin yapılacaklar listesi olarak ele alın.

[
{
"testId": "LoginTest.loginWithValidCredentials",
"originalLocator": "By.cssSelector: div.header input#email",
"healedLocator": "By.id: email",
"strategy": "id-from-css",
"timestamp": 1719920400000
}
]

Kendini onarma vs. SmartLocator​

İkisi de locator'ları daha dayanıklı kılar ancak farklı sorunları çözer:

Kendini onarma (bu sayfa)SmartLocator
Ne zaman faaliyete geçerBir locator çalışma zamanında başarısız olduktan sonraÖnceden — adayları kendiniz önden sağlarsınız
Alternatifleri kim sağlarFramework bunları başarısız locator'dan türetirSiz onları açıkça listelersiniz
İsteğe bağlılık kapsamıGlobal (locators.selfHealing: true)Çağrı sitesi başına
En uygun olduğu yerBeklenmedik kaymayı yakalamak ve sonraki için loglamakOrtamlar arasında farklı olduğunu zaten bildiğiniz locator'lar

İyi bir araya gelirler: varyasyon öngördüğünüz yerlerde SmartLocator kullanın ve öngörmediğiniz kaymaları işaretleyen bir güvenlik ağı olarak kendini onarmayı açık bırakın.


Ne zaman kullanılır​

DurumKendini onarma etkinleştirilsin mi?
İşaretlemesi sürekli değişen aktif geliştirmedeki uygulamaEvet — seçicileri güncellerken CI'ı yeşil tutar
Hangi locator'ların kaydığını görmek istiyorsunuzEvet — JSON logu sizin düzeltme listeniz
Herhangi bir locator değişikliğinin derlemeyi başarısız etmesi gereken sıkı suiteHayır — kaymanın başarısızlık olarak görünmesi için kapalı bırakın
Onarmanın çürümeyi gizlemesine izin vermeyin

Onarılmış bir test bir uyarıdır, göz ardı edilecek bir geçiş değil. target/healed-locators.json dosyasını düzenli olarak inceleyin ve alttaki seçicileri güncelleyin — sürekli onarılan bir locator, sonunda hiçbir geri dönüşün kurtaramayacağı şekilde bozulacak olan bir locator'dır.