Değişiklik Günlüğü
TestFly'deki tüm kayda değer değişiklikler burada belgelenmiştir.
[1.0.7] — 2026-10-09
Eklenenler
- Standart
Locator.cssSelector(String): Selenium'unBy.cssSelectoradlandırma standardına tam uyumlu, akılda kalıcı ve birincil fabrika metodu olarakLocator.cssSelector(String)eklendi. - Doğrulama Sistemi Mimari Sınırları: TestFly'ın otomatik beklemeli Web UI doğrulamaları (
LocatorAssert,PageAssert) ile genel amaçlı ilkel veri kontrolleri (AssertJ / TestNG'ye devredilen) arasındaki mimari sınırlar resmileştirildi. execution.sessionWaitSeconds(varsayılan300,0= bekleme,>= 0olarak doğrulanır):execution.maxActiveSessionsdolduğunda bir testin boş tarayıcı slotu için ne kadar bekleyeceğini belirler. Daha önce sabit kodlanmış 30 saniyelik bekleme yerine geçer.ExecutionValidator.crossCheckWarnings: paralel çalıştırmadaexecution.threadCount,execution.maxActiveSessionsdeğerinden büyükse uyarı yazdırır; fazla thread'ler tarayıcı slotu için kuyrukta bekler.LoadTestDetector(dahili): bir testin yük testi olup olmadığına karar veren tek nokta (bkz. Değişenler).testfly-test-authoringajan skill'i: alan bazlı başvuru belgeleriyle (WebUI, API, TestNG, JUnit 5, Cucumber, yük testi).
Değişenler
- Yük testi algılama artık açıktır (davranış değişikliği). İsme dayalı dört
contains("loadtest")sezgisi (DriverManager,TestExecutionListener,TestFlyExtension,CucumberHooks) tek birLoadTestDetectorile değiştirildi. Bir test yalnızcaBaseLoadTestsınıfını genişletiyorsa,LoadTestSupportarayüzünü uyguluyorsa,@LoadTest/@NoBrowserile işaretliyse veya tam@loadtestCucumber etiketini taşıyorsa yük testi sayılır (WebDriver oluşturulmaz).FileUploadTest,DownloadTestgibi sınıflar veyacom.acme.uploadtestsgibi paketlerdeki testler artık sessizce WebDriver'dan yoksun bırakılmaz. Eski isim sezgisiyle eşleşen ancak yeni kurallarla eşleşmeyen sınıf/etiketler için bir kez WARN yazılır. Locatoraksiyonları (click,fill,text, ...) artıktimeouts.explicitsüresine kadar otomatik bekler; her yoklamada elementi yeniden çözer (stale referansları da toparlar) ve süre dolunca kendini onarmayı dener.isVisible(),isEnabled()vecount()beklemesiz kalır.DriverManager.getDriver()artık driver'ın neden bulunmadığını (@Test/@PreCondition/@ConditionProviderdışında, örn.@BeforeMethodiçinde) ve kurulumun nereye taşınacağını açıklar.- Oturum slotu zaman aşımı hatası artık hem
execution.maxActiveSessionshemexecution.sessionWaitSecondsayarını belirtir. - Jackson modülleri
jackson-bom2.21.7 ile sabitlendi (önceden yalnızcajackson-databind, 2.21.6 olarak sabitlenmişti); geçişli ve opsiyonel Jackson modülleri tek sürümde kalır. - JaCoCo ajanı artık Surefire JVM'ine bağlanıyor (
argLinedeğeri@{argLine} ...); böylecemvn verifytarget/jacoco.execve kapsam raporunu üretir. - GPG imzalama varsayılan derlemeden
releaseMaven profiline taşındı:mvn verify/mvn installanahtar gerektirmez; yayın-Preleaseile yapılır.
Kullanımdan Kaldırılanlar (Deprecated)
Locator.css(String):Locator.cssSelector(String)lehine kullanımdan kaldırıldı (@Deprecated). Mevcut kodları bozmamak için arkaplanda kesintisiz delegasyon yapmaya devam eder.
Düzeltilenler
getByText()metni taşıyan elementi değil en dıştaki atayı (html/body/sarmalayıcıdiv) döndürüyordu; artık yalnızca en içteki eşleşmeyi döndürür.exact()aynı mantığı kullanır.- Yük testleri: HTTP durum kodları artık
statusCodesiçine kaydedilir (taşıma hataları sentetik-1koduyla),LoadScenario.assertStatus(n)başka bir durum kodu oluştuğunda artık başarısız olur (önceden farklı bir kod içinassertNoStatusçağırıyordu) veextract()feeder'sız senaryolarda da çalışır. - HTML raporu: sayfaya gömülen rapor verisi
<script>bağlamı için kaçışlanır (<, U+2028, U+2029); hata mesajları ve test verisi artık işaretleme enjekte edemez veya script bloğunu kapatamaz. Şablon yer tutucuları tek geçişte doldurulur, bu yüzden yerleştirilen değerler tekrar taranmaz. DriverManageroturum izinleri: bir izin,driver.quit()hata fırlatsa ve driver oluşturmanın her başarısızlık yolunda bile, driver başına tam bir kez iade edilir (maxActiveSessionsdeğerini tüketebilen izin sızıntısı).DriverManager.recreateDriver()artık ölü birper-suitedriver'ı da değiştirir (daha önce suite kayıt defterinde kalıyordu);quitAllSuiteDrivers()yalnızca gerçekten tutulan izinleri iade eder.OpenApiValidator, doğrulayıcıya tam URL yerine URI yolunu ve yanıtınContent-Typebaşlığını iletir; bu, "No API path found" hatalarını ve yanıt gövdesi doğrulamasını düzeltir.
Güvenlik
.github/workflows/release.ymlsıkılaştırıldı: yayın sürümü bütün bir dize olarak doğrulanır (satır sonu veya betik enjeksiyonu yok) ve yalnızca ortam değişkeni üzerinden okunur, betiklere asla yerleştirilmez; yayın commit'imainüzerinden erişilebilir olmalıdır; yayınlamareleaseGitHub environment'ına bağlıdır; pom sürümü yayın sürümüne eşit olmalıdır (tag push'ları artık yeniden yazılmaz); testler bir kez çalışır, GPG imzalama yalnızca-Preleaseile etkindir ve tag/GitHub Release doğrulanan commit üzerinde oluşturulur.
Dokümantasyon ve Spesifikasyonlar
- Mühendislik Spesifikasyonları Modernizasyonu: Kök
docs/spesifikasyonları (internals.md,public-api.md,architecture.md,testng-listeners.md), Java 21 LTS standardı,SmartTriageEngine,FuzzyHealingEngineve assertion sınırları ile güncellendi. - Dokümantasyon Sitesi Senkronizasyonu: Semantik seçiciler, doğrulamalar ve kendini onarma kılavuzları hem İngilizce hem Türkçe yerellerinde güncellendi.
- Ajan Bilgi Grafiği Senkronizasyonu:
[[wiki/assertion-system]]sayfası oluşturuldu, mimari ve WebUI wikileri güncellendi,MAP.mdharitasına bağlandı. - Dokümantasyon denetimi (EN + TR): Maven koordinatı her yerde
io.github.hakanngulolarak düzeltildi, gerçek API ile derlenmeyen örnekler yeniden yazıldı, yük testi dokümanları gerçek DSL ile (load(path).users().rampUp().hold(),LoadTestFeeder,@LoadTestöznitelikleri) hizalandı;WaitEngine, Kubernetes/dağıtık yük testi, Allure ve CI kurulumu hakkındaki iddialar düzeltildi. Kurulum rehberleri artık hangi sürümün Maven Central'da, hangisinin bu checkout'ta olduğunu belirtir. - Ajan yönergeleri birleştirildi:
AGENTS.mdtek giriş noktasıdır (GEMINI.md,PRODUCT.mdvefeatures/features-report.mdkaldırıldı);ROADMAP.mdveCONTRIBUTING.mdgüncellendi, eskimiş planlama belgeleridocs/altından kaldırıldı.
Testler
- Birim test paketi 1362'den 1444 teste çıktı; HTML rapor kaçışlama,
DriverManager(izin muhasebesi, per-suite yeniden oluşturma, slot bekleme),LoadTestDetector,JdkLoadEngine,OpenApiValidator,ExecutionValidator,Locatorotomatik bekleme ve test-id yapılandırma izolasyonu için regresyon testleri eklendi.
[1.0.6] — 2026-09-29
Eklenenler
- Akıllı Hata Triyajı (
SmartTriageEngine):TestExecutionListeneriçine entegre edilen, hata hiyerarşisini inceleyerek test başarısızlıklarını harici LLM maliyeti olmadan (0 token) sınıflandıran (SYSTEM_FLAKY,APPLICATION_BUG,NEEDS_INVESTIGATION) yerel heuristik analiz motoru. - Fuzzy Self-Healing (
FuzzyHealingEngine): Harici LLM'e gitmeden önce DOM adayları ve öznitelik ipuçları üzerinde Levenshtein mesafe algoritması kullanarak ultra hızlı (5ms altında) çalışan sıfır maliyetli yerel onarım motoru. - Auto-POM Sayfa Bilgi Sistemi: Otonom sayfa öğesi keşfi ve yerel anlamsal intent çözümlemesi sağlayan öğrenen önbellek yapısı (
PageKnowledge). - Locator Üzerinde Sıralı Koleksiyonlar (Sequenced Collections): Java 21 sequenced collections altyapısını kullanarak
Locatorüzerinefirst()velast()gezinme metotları eklendi. BaseJUnit5ApiTest: JUnit 5 Jupiter paketleri için doğrudanapi()istemcisi desteği sağlayan REST API temel test sınıfı.NavigationSupportYardımcıları: Gelişmiş pencere yönetimi, sekmeler arası geçiş ve tarayıcı gezinme metotları.- HTML Raporu Log Filtreleri: Rapor zaman çizelgesinde etkileşimli INFO ve DEBUG log seviyesi görünürlük butonları.
Değişenler
- Java 21 LTS Modernizasyonu: Framework derleyicisi ve çalışma tabanı Java 21 LTS (
--release 21) standardına yükseltildi; kod tabanı genelinde Pattern Matching (instanceof), switch ifadeleri ve Stream.toList()yapılarına geçildi. - Doğrudan Selenium By Uyumu (
Locator extends By):Locatorsınıfı doğrudan Selenium'unorg.openqa.selenium.Bysınıfını genişleterek yerel Selenium API'leri ile (driver.findElement(locator)) %100 şeffaf uyumlu hale getirildi. - Clean API Refactor:
Locatorsınıfı gereksiz öneklerden (ofCss,inputValue,getValue) arındırılarak daha sade ve tek tip (zero-boilerplate) bir API'ye kavuşturuldu. - Support Interface Kapsamı:
Supportarayüzleri (ApiSupport,BrowserSupport,LocatorSupport) alt motorların tüm yeteneklerini %100 kapsayacak şekilde genişletildi. - Null-safe Aksiyonlar:
Locator.type()veLocator.append()metotları artık tamamen null-safe;nullveya""geçildiğinde hata fırlatmak yerine elementi güvenle temizliyor.
Performans
- Yük Testinde Sanal İş Parçacıkları (Virtual Threads):
JdkLoadEngineiçinde Project LoomExecutors.newVirtualThreadPerTaskExecutor()kullanılarak ultra hafif ve yüksek eşzamanlı yük testi desteği sağlandı. - Video Kayıt Bellek Optimizasyonu: Video kaydedici ham byte karelerini saklar ve yalnızca test başarısız olduğunda tembel çözme (lazy-decoding) uygular; bu sayede uzun koşumlarda bellek (heap) tüketimi dramatik biçimde azaltıldı.
Düzeltmeler & Güvenilirlik
- Garantili WebDriver Temizliği: Olağandışı sonlanmalarda bile tarayıcı süreçlerinin kapatılmasını garanti altına alan JVM shutdown kancaları ve
@AfterAlllistener tetikleyicisi eklendi. - Thread-Safe Bootstrap: Eşzamanlı suite başlatmaları sırasında framework bootstrap mekanizması yarış durumlarına (race condition) karşı güçlendirildi.
[1.0.5] — 2026-09-12
Eklenenler — İnteraktif Web Kaydedici & Web Stüdyosu (testfly record)
- Eklentisiz Canlı Chrome Eşlikçisi:
testfly record <url>komutuyla izole Chrome açılır ve Chrome DevTools Protocol (CDP) üzerindeninjected_recorder.jsotomatik enjekte edilir.- Tıklamalar, tuş vuruşları (debounced typing) ve görsel doğrulamalar SSE (Server-Sent Events) ile gerçek zamanlı olarak yerel stüdyoya (
:8765) aktarılır. - Tek tıkla görsel doğrulamalar (
isVisible,isEnabled, tam ve içeren eşleşmelihasText).
- 4'ü 1 Arada Çoklu Mimari Kod Sentezi:
- Page Object Model (
BasePage), bağımsız TestNG (BaseTest), JUnit 5 (BaseJUnit5Test) ve Cucumber BDD (.feature) formatlarında anlık kod derleme. - Java anahtar kelime çakışmalarına karşı derleyici korumaları (örn.
continueElement). - Tek tıkla "Save to Project" butonuyla sınıfları doğrudan
src/test/java/dizinine yazma.
- Page Object Model (
- Mimari Karar Kaydı (ADR-001):
- Stüdyo, CDP eşlikçisi ve MCP protokol sınırları için resmi mimari karar belgesi (
docs/ai/adr-001-mcp-recorder-architecture.md).
- Stüdyo, CDP eşlikçisi ve MCP protokol sınırları için resmi mimari karar belgesi (
Eklenenler — Model Context Protocol Sunucusu (testfly mcp)
- Protokol Seviyesinde AI Tarayıcı Otomasyonu:
- Claude Code, Cursor, GitHub Copilot ve JetBrains AI asistanlarına canlı tarayıcı kontrolü sağlayan 88 yerleşik MCP aracı.
- AI modellerinin canlı DOM ve erişilebilirlik (a11y) ağacını doğrudan inceleyerek hayali seçiciler yerine üretime hazır TestFly Java testleri yazabilmesi.
Eklenenler — Akıllı Test Dağıtıcı (SmartTestSharder)
- LPT Bin-Packing ile Dengeli Test Dağıtımı:
- Dağıtık CI worker nodeları arasında test paketlerini en dengeli şekilde bölüştüren Longest Processing Time (LPT) bin-packing algoritması.
- Geçmiş test sürelerini analiz ederek CI bekleme sürelerini minimize eden optimal paralelleştirme.
Eklenenler — Yük ve Performans Testi Modülü
- Çift Motorlu Yük Testi Mimarisi:
- Gatling Motoru: Yüksek eşzamanlı alt süreç (subprocess) yürütme, otomatik simülasyon üretimi, konsol/log ayrıştırma ve TestFly raporlarına entegre etkileşimli Gatling HTML raporu.
- Hafif Sanal İş Parçacığı (Virtual Thread) Motoru: Harici bağımlılık gerektirmeyen, geliştirici makineleri ve hızlı CI/CD döngüleri için optimize edilmiş saf Java sanal iş parçacığı motoru.
- Akıcı (Fluent) Yük Testi DSL'i:
load(path).users(n).rampUp(duration).hold(duration).run()veyaloadScenario("name").step(...).run()ile bildirimsel senaryolar.BaseLoadTest(tarayıcı başlatmayan yük testi taban sınıfı) içinde kullanılabilir.
- Anotasyon Odaklı Yürütme (
@LoadTest):- Sınıf veya metot düzeyinde
@LoadTestileusers,rampUp,hold,cooldown,enginevebaseUrlayarları.
- Sınıf veya metot düzeyinde
- Veri Besleyiciler (
LoadTestFeeder):csv,json,random,uuid,sequenceveconstantLoadTestFeederfabrikaları ile senaryo üzerindefeedCsv/feedJsonkısayolları.
- SLA ve Gecikme Doğrulamaları (
LoadTestAssert):- Yüzdelik dilimler (P50, P90, P95, P99), maksimum yanıt süresi, minimum RPS ve hata oranı limitleri için akıcı doğrulamalar.
- Birleşik Çok Kanallı Raporlama:
- TestFly HTML Raporu: Özel "Yük Testi" sekmesi, KPI kartları, yanıt süresi yüzdelikleri, HTTP durum kodları dağılımı ve etkileşimli Gatling rapor linki.
- Allure Rapor Uyarlayıcısı: Yük testi parametreleri, Gatling rapor linki, özet markdown ve alt süreç log ekleri.
- ReportPortal Uyarlayıcısı: Adım detaylarına formatlanmış Markdown özet logu ve log dosyası eki.
Eklenenler — Özellik Santrali (Feature Switchboard)
features:ana kontrol paneli —testfly.ymliçinde tüm opsiyonel modülleri (ai,recording,tracing,network,healing,visual,performance,flakiness,quarantine,testManagement,notifications,consoleErrors) tek bir noktadan açıp kapatma imkanı.FeatureGate(io.testfly.config.FeatureGate) — Özellik durumları için merkezi sorgulama API'si.ai.enabledana AI anahtarı — Tüm AI özelliklerini tek bayrakla devre dışı bırakabilme.
Değiştirilenler — HTML Raporu & Güvenlik Sıkılaştırma
- HTML Raporu Cupertino Lab Tasarımı — Cupertino Lab estetiği, optimize edilmiş tablo yoğunluğu, hata önceliklendirme kartları ve karanlık mod iyileştirmeleri.
- Flakiness Radar — Test stabilitesini ardışık koşularda görsel olarak puanlama.
- Güvenlik Sanitizasyonu — HTML raporda XSS açıklarını önleyen güvenli DOM render ve escape yardımcıları (
escapeHtml,sanitizeUrl,safeText). - Depo Güvenlik Nitelikleri — Harici kütüphanelerin ve kilit dosyalarının yanlış pozitif vermesini önleyen
.gitattributesyapılandırması. - Esnek
testfly.ymlayrıştırma — Tanınmayan konfigürasyon anahtarları çökmeye sebep olmadan uyarı olarak loglanır. - Kapalı özelliklerde hızlı hata verme — Devre dışı bırakılmış modüllere yapılan açık çağrılar sessizce geçiştirilmek yerine açıklayıcı hata verir.
- Ana Sayfa Modülerleştirmesi —
homeData.jsile düşük kod entropisi ve temiz React mimarisi.
[1.0.4] — 2026-09-07
Eklenenler — Ajanik Test (Agentic Testing) & Otonom AI
- Yapay Zeka Destekli İleri Seviye Kendi Kendini Onarma (Self-Healing) —
DomPrunerkarmaşık web DOM ağaçlarını anlamsız düğümleri budayarak 8K token altına sıkıştırır.AiHealingEngine, statik yedekler tükendiğinde LLM muhakemesiyle yeni seçici sentezler ve.testfly/healed-locators.jsondosyasında önbelleğe alır; önbellek isabeti yeni bir AI isteğini önler ancak sıfır yürütme süresi garanti etmez. - Yapay Zeka Destekli Otomatik PR Yamaları (Auto-PR Patches) —
SourceCodeLocatorçalışma anındaki hataları doğrudan tüketici test ve sayfa nesnesi sınıflarına eşler.RemediationPatchGenerator, tek komutlagit applyyapılabilen temiz Unified Git Diff.patchdosyalarınıtarget/remediations/dizinine üretir. - Semantik Doğal Dil Doğrulamaları —
PageAssertveLocatorAssertüzerindesatisfiesAi(şart)veviolatesAi(şart)doğrulamaları. Anti-throttle korumalı tek seferlik akıllı kontrol ve soft assertion desteği. - Hedef Odaklı Adımlar (
act) & Compile & Freeze Önbelleği —act(String goal)vebyIntent(String intent)ile doğal dil hedeflerini somut Selenium adımlarına derler ve.testfly/action-cache.jsondosyasına kaydeder; önbellek isabeti yeni bir LLM isteğini önler, sabit bir gecikme garantisi vermez. - Açılır Menü & Sayfa Navigasyon Primitifleri —
ActionType.SELECTveActionType.NAVIGATEeylemleriyle hedef element olmadan da sayfa geçişleri ve seçimler.
Eklenenler — API Testi İyileştirmeleri
- HTTP Seviyesinde Yeniden Deneme (
api.retry.*) — Geçici 502/503/504 hataları için üstel geri çekilmeli (exponential backoff) otomatik retry. - İstek Başına Zaman Aşımı & Parametre Oluşturucu —
.timeout(120)ve.queryParam("key", "value"). - İstek/Yanıt Yakalayıcıları (Interceptors) & Cookie Jar — Global ve iş parçacığı güvenli interceptor'lar ve otomatik çerez kavanozu (
.withCookies()). - Akıcı API Doğrulamaları — Yanıt süresi (
assertDurationLessThan), başlık (assertHeader), gövde regex (assertBodyMatches) ve JSON yapı doğrulamaları (assertJsonExists,assertJsonNull,assertJsonArraySize).
Eklenenler — Report Portal Entegrasyonu
- Otomatik Çalışma Tipi Tespiti — Test sınıflarına göre otomatik Web veya API tespiti (
reporting.reportportal.type: auto). - Zenginleştirilmiş Lansman Adı ve Açıklaması — Ortam, bağlam duyarlı baseUrl ve CI platform bilgileriyle detaylandırılmış pano görünümü.
- JUnit 5 → Report Portal Köprüsü — JUnit 5 testlerinin sonuçlarını otomatik olarak Report Portal'a aktarma.
Düzeltilenler
- OAuth2 Token Önbellek Yarış Durumu — Süresi dolan tokenlarda çift kontrollü kilitlemeyle (double-checked locking) yarış durumunun engellenmesi.
- Karanlık Mod Metin Görünürlüğü — Prism kod bloklarında ve arama açılır menüsünde okunabilirlik düzeltmeleri.
- Oturum Önbellek İzolasyonu —
BrowserSessionCachevePreconditionSessionCachegeri yükleme öncesi localStorage temizliği ve güvenli script argümanı aktarımı. - Çok Satırlı DataProvider ile @PreCondition Çakışması — Önbelleğin yalnızca gerçek retry anında geçersiz kılınması.
[1.0.0] — 2026-08-20
Changed
- Project rebrand to TestFly — complete identity migration from Selenium Boot:
- Maven coordinates changed to
io.testfly:testfly:1.0.0(historical entry: legacy group ID; the current coordinate isio.github.hakanngul:testfly) - Java namespace changed to
io.testfly - Configuration file renamed to
testfly.yml - Public API annotation renamed to
@TestFlyApi - Report artifacts renamed to
testfly-report.htmlandtestfly-metrics.json - Documentation, CI workflows, and MCP tooling rebranded under TestFly
- No functional breaking changes; the same Selenium-based ecosystem continues under the new identity.
- Maven coordinates changed to
[3.3.0] — 2026-08-15
Fixed
execution.parallelvalidation now matches TestNG's own parallel modes —testsandinstancesare legitimate TestNG modes that flow straight through toXmlSuite.setParallel()and behave exactly likemethods/classesdownstream, but TestFly's bootstrap validator rejected both, reporting a misleading "Parallel execution configuration missing" for a value that was present but not on a hand-written allowlist. Validation now delegates to TestNG'sXmlSuite.ParallelModeenum directly, sonone,methods,classes,tests, andinstancesare all accepted, and an unrecognised value's error message names both the rejected value and the full valid set. (Fixes #35)
[3.2.0] — 2026-07-18
Added
- Three new
WaitEngineconditions, consistent with the existingwaitFor*naming:waitForAttribute(By, attribute, value)— waits for an exact attribute match (seewaitForAttributeContainsfor a substring match).waitForUrlMatches(String regex)— waits for the current URL to match a regular expression (seewaitForUrlContainsfor a substring match).waitForTextMatches(By, String regex)— waits for an element's visible text to match a regular expression.- Purely additive to the
@TestFlyApisurface — no breaking changes.
[3.1.1] — 2026-06-26
Fixed
- Report overwrite with multiple test engines — the metrics JSON, HTML report, and metrics history now honor the
testfly.reports.dirsystem property (defaulttarget). When a TestNG suite (Surefire) and JUnit 5 tests (Failsafe) run in the same build, point each engine's run at its own directory (e.g.-Dtestfly.reports.dir=target/junit5) so they no longer overwrite each other's HTML report. NewReportPathshelper centralizes path resolution.
[3.1.0] — 2026-06-25
Added
- Accessibility-first locators — Playwright-style semantic locators available on
BaseTestandBasePage:getByRole,getByText,getByLabel,getByPlaceholder,getByTestId,getByAltText,getByTitle. They target the accessibility tree the user perceives rather than brittle CSS/DOM structure, so tests survive redesigns. getByRole(Role)— 36 WAI-ARIA rolü; örtük HTML öğeleri (<button>,<a href>,<h1>…) ve açıkrole="…"nitelikleriyle eşleşir. İlk yayındaki 38 sayısı düzeltilmiştir..withName("Submit")ve.withLevel(1)ile daraltılabilir.- Case-insensitive substring matching by default, with
.exact()opt-in. All locators flow through the existing auto-waitLocatorchain — noThread.sleep, no explicit waits. toBy()escape hatch — every semantic locator can return its synthesized SeleniumByfor interop with raw Selenium orSmartLocator.- Configurable test-id attribute —
locators.testIdAttributeintestfly.yml(defaultdata-testid).
[3.0.0] — 2026-06-21
Added
- TestRail Integration —
@TestRailCase("C1234")on any test method (or class) pushes results to TestRail automatically; supports multiple IDs (@TestRailCase({"C1234", "C5678"})); creates a named run on suite start (autoCreateRun: true); maps PASSED→1, FAILED→5, SKIPPED→Retest(4); failure exception message is sent as the result comment - Xray Integration —
@XrayTest("PROJ-123")pushes results to Xray Cloud or Xray Server/DC; Cloud uses OAuth2 client credentials; Server uses HTTP Basic auth against Jira; results are batch-imported at suite end - Zero extra dependencies — both clients use
java.net.http.HttpClient(built into Java 21) - TestNG + JUnit 5 — same annotations work in both test frameworks; framework automatically detects and routes to the correct listener
Config
testmanagement:
testrail:
enabled: true
url: https://yourcompany.testrail.io
username: [email protected]
apiKey: YOUR_API_KEY
projectId: 1
suiteId: 2 # optional — omit for single-suite projects
runName: "TestFly – CI run"
autoCreateRun: true # set false and provide runId to use an existing run
xray:
enabled: true
mode: cloud # "cloud" (Jira Cloud) or "server" (Server / Data Center)
# Cloud fields:
clientId: YOUR_CLIENT_ID
clientSecret: YOUR_CLIENT_SECRET
# Server/DC fields:
# jiraUrl: https://jira.example.com
# username: admin
# password: secret
projectKey: PROJ
testPlanKey: PROJ-1 # optional — links the execution to a Test Plan
[2.6.0] — 2026-06-20
Added
- Gradle Build Support —
testImplementation 'io.testfly:testfly:2.6.0'+test { useTestNG() }is the complete Gradle setup; full docs cover Groovy DSL, Kotlin DSL, JUnit 5 bridge, parallel execution, optional dependencies, and./gradlew testequivalents for allmvncommands (historical entry: legacy group ID; the current coordinate isio.github.hakanngul:testfly) - JUnit XML auto-detection —
JUnitXmlReporternow detects the active build tool at runtime: writes tobuild/test-results/test/(Gradle) when only abuild/directory exists, ortarget/surefire-reports/(Maven) otherwise; override with-Dtestfly.reports.dir=system property - Cross-build-tool version reporting —
FrameworkVersion.get()now readsImplementation-Versionfrom the JAR'sMANIFEST.MFas the primary source (works with both Maven and Gradle); falls back toMETA-INF/maven/.../pom.properties(Maven-only) and then"0.0.0";maven-jar-pluginconfigured withaddDefaultImplementationEntries: trueto populate the manifest on every Maven build
[2.5.0] — 2026-06-20
Added
- Accessibility Assertions (axe-core) —
accessibility()inBaseTestandBaseJUnit5Testruns a full axe-core WCAG scan on the active page; axe-core 4.10.2 bundled in the JAR — no CDN, no extra Maven dependency required - Fluent builder:
.withTags("wcag2a", "wcag21aa")restricts rules to WCAG 2.1 AA;.withLevel(Impact.SERIOUS)filters violations by minimum severity;.excluding("#cookie-banner")skips known third-party elements;.withContext("#main-form")scopes the scan to a subtree .run()— asserts zero violations and throws a detailedAssertionErroron failure, showing rule ID, severity (CRITICAL/SERIOUS/MODERATE/MINOR), fix guidance, element CSS selector path, and link to the axe-core docs for each failing node.collect()— returns rawAccessibilityResultfor custom inspection without asserting;result.violations(),result.violationsAtLevel(Impact.SERIOUS),result.passCount()Impactenum with ordering:CRITICAL > SERIOUS > MODERATE > MINOR;Impact.fromString(str)parses axe-core impact stringsAccessibilityResult,AccessibilityViolation,AccessibilityViolation.NodeDetailall available viaaccessibility().collect()for custom reporting or soft assertions
[2.4.0] — 2026-05-19
Added
- Performance Assertions (Core Web Vitals) —
assertPerformance()collects LCP, FCP, TTFB, CLS, DOM load, and page load from the active browser page using browser-native APIs (window.performance.getEntriesByType()); no extra dependency or proxy required - Fluent assertion chain:
.lcp().isBelow(2500).fcp().isBelow(1800).ttfb().isBelow(600).cls().isBelow(0.1)with colour-coded error messages showing actual vs threshold values collectPerformance()— rawPerformanceMetricsaccess for custom assertions or logging- LCP/CLS available on Chrome/Edge only; assertions on unavailable metrics are silently skipped (not failed), enabling cross-browser test suites
performance.captureOnEveryTest: true— auto-captures metrics after every passing test; ⚡ Performance strip with green/yellow/red chips shown in the HTML report test detail panelPerformanceAssert,PerformanceMetrics,PerformanceCollectorall available viaclock()pattern inBaseTestandBaseJUnit5Test
Config
performance:
captureOnEveryTest: false # show metrics in HTML report for every test
lcpWarnMs: 2500
fcpWarnMs: 1800
ttfbWarnMs: 800
clsWarn: 0.1
[2.3.0] — 2026-05-17
Added
- Test Quarantine —
testfly-quarantine.ymlin the project root lists tests to skip permanently; committed to version control so it survives fresh CI clones; supports TestNG, JUnit 5, and Cucumber; two entry formats: plain string (com.example.LoginTest#method) and structured with optional reason (test: …\nreason: "JIRA-123") - Class-level quarantine — a class-only entry (
com.example.PaymentTest) skips every method in that class - Cucumber quarantine — two methods: (1) add
@quarantinetag to a scenario in the.featurefile; (2) list entries intestfly-quarantine.ymlusing any of three formats: by Cucumber tag ("@smoke"— bulk across all features carrying that tag), by feature file (login.feature— all scenarios in the file), or by feature+name ("login.feature#Login with expired session"— specific scenario without editing the feature file) quarantine.enabledflag — set tofalseto temporarily run the full suite without removing entries from the file- File resolution — system property
-Dtestfly.quarantine=, working directory, classpath (in that order); missing file = silent no-op
Config
quarantine:
enabled: true # false = disable without editing the file
cucumberTag: quarantine # Cucumber tag name (without @)
testfly-quarantine.yml
quarantine:
- com.example.tests.LoginTest#loginWithExpiredSession
- com.example.tests.PaymentTest # entire class
- test: com.example.tests.SearchTest#searchSpecial
reason: "JIRA-1234 — Unicode handling broken"
[2.2.0] — 2026-05-12
Added
- External
@TestDatasources —@TestDatanow acceptscsv:,excel:, anddb:prefixes in addition to the existing JSON/YAML files;sheetattribute selects an Excel worksheet;rowattribute picks the zero-based data row (header excluded); type coercion applied automatically (integers, doubles, booleans); Apache POI required for Excel (addpoi-ooxml:5.2.5to your project, optional dep) - CSV source —
@TestData("csv:testdata/logins.csv")— RFC 4180 quoting support, built-in parser, no extra dependency - Excel source —
@TestData(value = "excel:testdata/users.xlsx", sheet = "Login")— reads XLSX via Apache POI; cell type mapping (numeric →long/double, date-formatted → ISO string, boolean →Boolean) - DB source —
@TestData("db:SELECT username, password FROM test_users WHERE active=1")— executes against thedatabaseconfig block; first result row loaded; participates in per-test connection lifecycle TestClock—clock().set("2030-01-01T00:00:00Z")injects a JSDateoverride into the browser;clock().advance(Duration.ofDays(30))fast-forwards relative to the current mock;clock().reset()restores real time; all three available viaclock()inBaseTestandBaseJUnit5Test; auto-reset called automatically after every test (pass, fail, skip)clockconfig block:clock.injectHeader/clock.headerNamefor optional server-side date header propagation
Config
clock:
injectHeader: false # send X-Mock-Date header to server
headerName: X-Mock-Date
[2.1.0] — 2026-05-04
Added
- BrowserStack integration —
execution.mode: browserstack;BrowserStackProviderbuilds W3Cbstack:optionscapabilities from YAML config; supports desktop (os,osVersion,browser,browserVersion) and mobile (device,realMobile); rawbstack:optionsoverrides viacapabilitiesmap; zero test-code change — all framework features work identically - Sauce Labs integration —
execution.mode: saucelabs;SauceLabsProviderbuilds W3Csauce:optionscapabilities; three regions supported:us-west-1,eu-central,apac-southeast; rawsauce:optionsoverrides viacapabilitiesmap - Cloud session URL in HTML report — after driver creation on BrowserStack or Sauce Labs, the session dashboard URL is captured from the remote session ID and stored; HTML report shows a "☁ View Session" link in the test detail panel linking directly to the BrowserStack/Sauce video and logs
DriverManager.getCloudSessionUrl()— public accessor for the current thread's cloud session URL;nullwhen running locally or against a self-hosted grid
Config
execution:
mode: browserstack # or: saucelabs | remote | local
browserstack:
username: ${BS_USER}
accessKey: ${BS_KEY}
os: Windows
osVersion: "11"
browser: chrome
browserVersion: latest
saucelabs:
username: ${SAUCE_USER}
accessKey: ${SAUCE_KEY}
region: us-west-1 # us-west-1 | eu-central | apac-southeast
platformName: "Windows 11"
browser: chrome
browserVersion: latest
[2.0.0] — 2026-05-04
Added
- Email Verification —
mailbox().waitForEmail(criteria)polls the inbox until a matching email arrives or the configured timeout expires; fluent criteria:to(address),.subject(text),.containing(text),.timeout(seconds);Emailvalue object withassertSubject(),assertBodyContains(),extractLink(linkText)(finds href of anchor by visible text);mailbox().clear()purges the inbox;email.autoClear: trueclears automatically before each test;to(address)shorthand available directly inBaseTest/BaseJUnit5Test(no static import needed) - Mailhog provider — polls
GET /api/v2/messages, parses multipart MIME;DELETE /api/v1/messagesto clear; ideal for local dev and CI Docker - Mailtrap provider — Mailtrap v1 REST API;
Api-Tokenheader auth;PATCH /cleanto clear - Outlook / Office 365 provider — Microsoft Graph API with app-only OAuth2 client credentials (no user sign-in); token auto-refreshed and cached; reads
GET /users/{mailbox}/messages; deletes per-message; setup: register Azure AD app, grantMail.Read+Mail.ReadWriteapplication permissions, admin consent - IMAP provider — connects to any IMAP server (Gmail app passwords, Yahoo, corporate); SSL/STARTTLS configurable; requires optional
com.sun.mail:jakarta.mail:2.0.1consumer dependency; helpful error thrown if jar missing
Changed
BaseTest/BaseJUnit5Test— newmailbox()andto(address)protected methodsTestFlyConfig— newemailblock withprovider,timeoutSeconds,pollIntervalMs,autoClear,mailhog,mailtrap,outlook,imapsub-sections
[1.13.0] — 2026-05-03
Added
@NoBrowser— class- or method-level annotation that tells the framework to skip all browser operations for that test: noWebDrivercreated, no recording started, no screenshot captured, no trace saved, no driver quit; all other services (HTML report, step timeline,ExecutionMetrics, retry, CI gates, hooks,@TestData,ScenarioContext) continue to work; available inBaseTest(TestNG) andBaseJUnit5Test(JUnit 5); designed for database assertions, file checks, or any non-UI logic in tests that extendBaseTestrather thanBaseApiTest
[1.12.0] — 2026-05-03
Added
- Multi-Session Testing —
withSession("alice", () -> { ... })switches the active driver to a named session for the duration of the lambda and restores the previous driver on exit;session("name")returns the namedWebDriverdirectly; all named sessions are automatically closed at test end; nestedwithSession()calls supported via a stack-based override inDriverManager; available inBaseTest(TestNG),BaseJUnit5Test(JUnit 5), and throughMultiSessionManagerdirectly - Database Assertions — JDBC-backed
DbClientwithassertRowExists(table, conditions),assertNoRow(table, conditions),assertRowCount(table, expected),assertRowCount(table, where, expected),query(sql, params).assertValue(column, expected),query(sql, params).value(column), andscalar(sql, params); plainjava.sql.DriverManager— no ORM or extra dependency; named datasources viadb("reporting"); connections cached per thread and closed automatically at test end;DbAssertException extends AssertionErrorso failures appear as test failures sessions.maxPerTestanddatabaseconfig blocks added toTestFlyConfig
[1.11.0] — 2026-05-03
Added
@Retryablefor JUnit 5 —TestFlyExtensionimplementsInvocationInterceptor;interceptTestMethodcatches failures and retries the test method with full driver recreation between attempts;@Retryablecan be placed on the method or the class;maxAttemptsattribute overrides the globalretry.maxAttemptsconfig;WebDriverparameter arguments are re-resolved to the new driver on each retry attempt@Retryablefor Cucumber —RetryAnnotationTransformerapplies TestNG retry toAbstractTestNGCucumberTests.runScenario; the entire scenario reruns from step 1 with a fresh driver per retry;CucumberHooks.beforeScenariodetects retries (testId already in metrics) and records retry count so the HTML report shows the retry badge
Changed
@Retryable— addedmaxAttemptsattribute (default-1= use config); addedTYPEtarget so it can be placed on a class to retry all its test methods; fully backward-compatible — existing usages without the attribute continue to work
[1.10.0] — 2026-05-02
Added
- JUnit 5 Support —
TestFlyExtension(@ExtendWith) provides full lifecycle: driver creation inbeforeEach, screenshot + error recording + AI analysis + trace + recording inafterEach(viacontext.getExecutionException()), per-suite driver cleanup inafterAll;WebDriverinjectable as a test method parameter viaParameterResolver;BaseJUnit5Testbase class withgetDriver(),getWait(),open(),$(),assertThat(),step();@EnableTestFlycomposed annotation;TestFlyLauncherListener(TestExecutionListener) generates HTML report, JSON metrics, and flakiness analysis when the JUnit Platform test plan finishes — registered automatically viaMETA-INF/services;junit-platform-launcherdeclared as optional dependency; parallel execution supported viajunit-platform.properties
[1.9.0] — 2026-05-02
Added
- BDD / Cucumber Integration —
BaseCucumberTest(runner base),BaseCucumberSteps(step definition base withgetDriver(),open(),$(),assertThat()),CucumberHooks(automatic driver lifecycle, metrics, screenshots, and report per scenario),CucumberStepLogger(Cucumber plugin that pipes Gherkin step names into the HTML report step timeline),CucumberContext(ThreadLocalScenarioholder); fully parallel-safe via ThreadLocal isolation; Scenario Outlines produce individual HTML report entries per example row;cucumber.propertiessupport for IDE single-scenario execution;cucumber-javaandcucumber-testngdeclared as optional dependencies — only pulled in by consumers who opt in
Changed
TestExecutionListener— skips allonTest*callbacks for Cucumber runner tests (AbstractTestNGCucumberTests#runScenario) to prevent duplicate HTML report entries when running BDD and TestNG tests in the same suiteExecutionHook.onTestEndjavadoc corrected: fires before driver quit, not after
[1.8.0] — 2026-04-16
Added
- Self-Healing Locators —
locators.selfHealing: true; whenwaitForVisible/waitForClickabletimes out the framework automatically tries fallback strategies derived from the originalBydescriptor: extractidfrom CSS#foo/ XPath@id,namefrom CSS[name]/ XPath@name, text from XPathtext(), class from CSS.className,data-testidandplaceholderattributes; healed tests get a⚠ healedbadge in the HTML report;target/healed-locators.jsonlists every healed locator for developer review - AI-Assisted Failure Analysis —
ai.failureAnalysis: true+ai.apiKey: ${CLAUDE_API_KEY}; on test failure callsclaude-haiku-4-5-20251001(configurable viaai.model) with error, stack trace, step log, URL, and page title; the plain-English root-cause analysis + suggested fix is embedded in the HTML report failure detail panel; call bounded byai.timeoutSeconds(default 20s); fully non-blocking — never affects suite outcome - Flakiness Prediction — reads last
NJSON run files fromtarget/metrics-history/; classifies each test asSTABLE(<10% failure rate),WATCH(10–threshold%), orHIGH(≥threshold); results shown in a new Flakiness Radar card on the HTML report Dashboard; exported totarget/flakiness-report.json; optionalflakiness.failOnHighFlakiness: trueCI gate
[1.7.0] — 2026-04-16
Added
- Trace Viewer —
tracing.enabled: trueintestfly.ymlgenerates a self-contained HTML trace file per failed test attarget/traces/{ClassName}/{testMethod}-trace.html; the file embeds a clickable step timeline (each step shows its screenshot on click), a final-state screenshot taken at the moment of failure, the error message, and full stack trace; zero CDN dependencies — all CSS/JS are inlined;captureOnPass: trueoption to generate traces for passing tests too; HTML report shows a "View Trace" link in the failure detail panel
[1.6.0] — 2026-04-16
Added
- Visual regression testing —
VisualAssert.assertScreenshot(name)pixel-by-pixel screenshot comparison; baseline auto-created on first run; diff image written totarget/visual-diffs/;VisualTolerance.of(n)for configurable pixel-difference tolerance;-DupdateBaselines=truesystem property forces baseline regeneration; configurable dirs viavisual.baselineDir/visual.diffDirintestfly.yml - Mobile device emulation —
DeviceEmulator.emulate("iPhone 14")/emulateDevice()+resetDevice()inBasePage/BaseTest; full CDP emulation on Chrome/Edge (viewport, device scale factor, user-agent); window-resize + JS UA override fallback on Firefox; 6 built-in profiles: iPhone 14, iPhone SE, Pixel 7, Galaxy S23, iPad, iPad Pro 12; register custom profiles viaDeviceProfiles.register() - Clipboard helpers —
ClipboardHelper.write()/read()/clear()backed by a reliable JS global store (window.__testFlyClipboard); async native clipboard attempted best-effort - GeoLocation mock —
GeoLocation.set(lat, lon)/clear(); CDPEmulation.setGeolocationOverrideon Chrome/Edge;navigator.geolocationJS override fallback on Firefox - Network interception —
NetworkMock.stub(urlPattern)with fluentStubBuilder; glob patterns (**/api/**); configurable response body, content-type, status code, and delay; auto-cleared after each test - Browser storage helpers —
StorageHelper.localStorage(),sessionStorage(),cookies()— read/write/clear browser storage from tests without JS boilerplate - Fluent Locator API —
$(css)/$(By)zincirlenebilir birLocatordöndürür;filter(String),withText(String),within(By),nth(int)desteklenir. Güncel davranış açıklaması:click(),type(),getText()veelement()bekler;isVisible(),count()veelements()anında çözümlenir. - Web-First Assertions —
assertThat(By)/assertThat(Locator)returningLocatorAssert; auto-retrying assertions:isVisible(),isHidden(),isEnabled(),hasText(),containsText(),hasValue(),hasAttribute(),hasClass(),count()
[1.3.0] — 2026-04-07
Added
- Shadow DOM helpers —
ShadowDomutility + 7BasePageprotected methods (shadowFind,shadowFindAll,shadowClick,shadowType,shadowGetText,shadowPierce,shadowExists) - Alert handling fix — set
unhandledPromptBehavior: ignoreon all driver providers so native alerts stay open;BasePage.getAndAcceptAlert()convenience method - Component-aware waits —
WaitEngine.waitForAngular()(Angular 2+ testability API + AngularJS 1.x fallback) andWaitEngine.waitForReactHydration()(React 18/17/16 fiber detection, Next.js aware) - Enhanced HTML report — pass rate gauge card, donut chart (Chart.js), retry badges, expandable inline error message + stack trace per failed row, filter buttons (
All / Passed / Failed / Skipped / Flaky), text search, dark mode toggle, slowest-5 tests section - JUnit XML error details —
<failure message>and element text now contain the actual assertion message and full stack trace instead of a generic placeholder - Allure adapter — opt-in Allure 2 result file generation; set
reporting.allureEnabled: trueintestfly.yml; producestarget/allure-results/{uuid}-result.jsonper test - Slack / Teams notifications — configure
notifications.slack.webhookUrland/ornotifications.teams.webhookUrl; post-suite summary sent automatically;notifyOnFailureOnlyoption @DependsOnApi— method- or class-level annotation; skips test before browser opens if the specified HTTP endpoint is unreachable; repeatable (multiple URLs, all must be up); result cached per suite to avoid redundant probes
[1.1.1] — 2026-03-28
Added
- Schema validation —
ApiResponse.assertSchema("schemas/user.json")validates response body against a JSON Schema (Draft-07); requirescom.networknt:json-schema-validator:1.4.3as consumer dependency @UseAuthannotation — apply a named auth strategy fromapi.authconfig block to any test method/classApiAuth.oauth2()— OAuth2 client credentials flow; token fetched on first use and cached until expiryApiClient.setGlobalAuth()/clearGlobalAuth()— suite-level auth set once, applied to every request automatically; cleared by framework after each test
[1.1.0] — 2026-03-25
Added
BaseApiTest— pure API test base class; no browser started; full framework lifecycle (reporting,@TestData, retry, CI gates)ApiClient— fluent HTTP client backed by Java's built-inHttpClient;GET,POST,PUT,PATCH,DELETE; per-request auth; auto step-loggingApiResponse— JSONPath extraction ($.user.id),asObject(Class), fluent assertions (assertStatus,assertJson,assertBodyContains)ApiAuth—bearerToken(token),basicAuth(user, pass)ScenarioContext— thread-local in-test store;ctx().set/get; auto-cleared after each testSuiteContext— global thread-safe store for cross-test state sharing;suiteCtx().set/getapiClient(),ctx(),suiteCtx()added toBaseTestfor hybrid UI+API tests
[0.10.0] — 2026-03-22
Added
@TestData— declarative test data injection via annotation; loads.json,.yml,.yamlfromsrc/test/resources/testdata/; env-specific override when-Denv=<profile>is set;getTestData()returnsMap<String, Object>inBaseTest- Browser matrix —
browser.matrix: [chrome, firefox, edge]in YAML runs all tests on all browsers in one invocation;Browsercolumn added to HTML report; per-browserTEST-testfly-<browser>.xmlfor Jenkins matrix view SessionCache— global (cross-thread) authenticated session store;store("name")captures cookies + localStorage;restore("name")applies them into the current driver and refreshes;invalidate()/clear()for teardown- SoftAssert —
softAssert().that(condition, "message")collects assertion failures without throwing; framework flushes atonTestSuccess; each failure logged asFAILstep entry; single screenshot at flush time; test markedFAILEDwith combined message
[0.9.6] — 2026-03-21
Added
- DownloadManager browser auto-configuration — Chrome sets
download.default_directoryvia experimental prefs; Firefox setsFirefoxProfiledownload preferences; both skipped whenexecution.mode: remote - File upload helper —
BasePage.upload(By, String)resolves absolute → classpath → project-root; CI-safe absolute path sent to Selenium
[0.9.5] — 2026-03-21
Added
- ConsoleErrorCollector auto-integration — JS shim auto-injected on every
open()call whenbrowser.captureConsoleErrors: true; errors auto-collected at test end asWARNstep entries in the HTML report failOnConsoleErrorsenforcement — passing test with JS errors is marked FAILED whenbrowser.failOnConsoleErrors: trueStepStatus.WARN— new step status for JS error entries
[0.9.4] — 2026-03-20
Added
- iFrame helpers expanded —
withinFrameName(String nameOrId, Runnable action)added toBasePage - Nested frame support —
withinFrame,withinFrameIndex,withinFrameNamenow use a thread-local depth counter; inner calls restore toparentFrame(), the outermost call restores todefaultContent()
[0.9.3] — 2026-03-20
Fixed
- Alert methods use
this.driver—acceptAlert,dismissAlert,getAlertText,typeInAlertinBasePagenow build theirWebDriverWaitfromthis.driver(the driver passed into the page object constructor) instead ofWaitEngine/DriverManager.getDriver(), eliminating the driver-mismatch that causedNoAlertPresentExceptionin precondition context @PreConditionerror message —PreConditionRunnernow unwrapsInvocationTargetExceptionto expose the real cause, so the failure message is meaningful instead of showing "null"
[0.9.2] — 2026-03-20
Fixed
@PreConditionfailure no longer triggers retry —TestExecutionListenernow catches precondition exceptions and re-throws asSkipException; the test is marked SKIPPED (not FAILED), the retry analyzer is not called, and no second browser is openedmaxAttempts: 0now respected in YAML —TestFlyConfig.Retry.maxAttemptschanged fromint(default1) to nullableInteger; the defaults loader now only applies a programmatic override when the value was not set at all (wasnull), not when explicitly set to0
[0.9.1] — 2026-03-19
Fixed
- Alert helpers now wait —
acceptAlert,dismissAlert,getAlertText,typeInAlertinBasePageuseWaitEngine.waitForAlert()instead of rawdriver.switchTo().alert(), preventingNoAlertPresentExceptionon slow pages
Added
WaitEngine.waitForAlert()— explicit wait for browser alert presenceBasePage.smartFind(By primary, By... fallbacks)— convenience wrapper aroundSmartLocator.find()for use inside page objects without passing the driver manually
[0.9.0] — 2026-03-18
Added
BasePageexpanded — dropdowns (selectByText,selectByValue,selectByIndex,getSelectedOption), alerts (acceptAlert,dismissAlert,getAlertText,typeInAlert), mouse actions (hover,doubleClick,rightClick), scroll (scrollTo,scrollToTop,scrollToBottom), JS fallbacks (jsClick,jsType)
[0.8.0] — 2026-03-17
Added
BasePage— page object base class withclick,type,getText,getAttribute,isDisplayed- iFrame helpers —
withinFrame(By, Runnable)andwithinFrameIndex(int, Runnable)inBasePage - File upload helper —
upload(By, String)inBasePage, resolves classpath and relative paths SmartLocator— tries multiple locator strategies in order, returns first visible elementDownloadManager—waitForFile,waitForAnyFile,clearDownloadswith partial-download detectionConsoleErrorCollector— JS console error capture via WebDriver logs (Chrome) or injected shim (Firefox)@PreCondition— session-aware pre-conditions with automatic cookie + localStorage caching@ConditionProvider— marks provider methods inBaseConditionssubclassesBaseConditions— base class for condition providers, givesgetDriver(),open(),click(),type()@TestFlyApi— annotation marking stable public API withsinceversionFrameworkVersion— runtime version access andrequireAtLeast()compatibility checkIncompatiblePluginException— thrown when plugin version requirements are not metminFrameworkVersion()— new method onTestFlyPluginfor version compatibility declarations- Config additions —
browser.downloadDir,browser.captureConsoleErrors,browser.failOnConsoleErrors
[0.7.0] — 2026-03-16
Added
- Browser lifecycle control —
browser.lifecycle: per-test | per-suitesetting - Per-suite driver management — browser stays open across tests when
per-suiteis configured - Step logging —
StepLogger.step()API for named test steps with optional screenshots and status badges - Step timeline — Step-by-step execution timeline in the HTML report detail panel
- Tabbed HTML report — Left sidebar navigation with Dashboard, Test Cases, and Failures tabs
- Failures tab — Pre-expanded failure details for faster debugging
- Inline step screenshots — Base64-embedded step screenshots with lightbox on click
Changed
- HTML report overhauled with tab-based layout and collapsible test rows
- Screenshot lightbox now opens full-size correctly
[0.6.0] — 2025-12-01
Added
- Advanced HTML reporting — Dashboard with metrics cards, test case table, retry summary
- Donut chart — Pass/fail/skip distribution chart on Dashboard tab
- Slowest tests — Top-5 slowest tests ranked by duration
- Pass rate gauge — Colour-coded pass rate percentage card
- Retry badge —
↻ Nxbadge on retried tests in the table
Changed
- Screenshots embedded as Base64 — report is now a single self-contained file
[0.5.0] — 2025-10-15
Added
- Retry support —
retry.enabled+retry.maxAttemptsintestfly.yml @Retryableannotation — per-method retry override- RetryAnnotationTransformer — auto-registered via Java SPI, zero config
- Retry metrics — retry counts tracked in
ExecutionMetricsand exported to JSON
[0.4.0] — 2025-08-20
Added
WaitEngine— fluent explicit wait API (waitForVisible,waitForClickable,waitForText, etc.)- Timeout override —
getWait(seconds)for per-call timeout override waitForStaleness— wait for DOM element replacement after AJAX reload
[0.3.0] — 2025-06-10
Added
BasePage— page object base class withclick,type,getText,isDisplayed,getAttribute- Parallel execution —
parallel.enabled+parallel.threadCountconfiguration - Session semaphore —
browser.maxActiveSessionscap on concurrent browser instances - JUnit XML reporter —
target/surefire-reports/TEST-TestFly.xml
[0.2.0] — 2025-04-05
Added
BaseTest— test base class withopen(),open(path),getDriver(),getWait()TestFlyConfig— YAML configuration loader (testfly.yml)DriverManager— ThreadLocal WebDriver lifecycle management- Automatic driver setup — WebDriverManager integration, no manual driver downloads
- Headless mode —
browser.headless: true - Basic HTML report — pass/fail/skip counts and duration
- Screenshot on failure — automatic capture, embedded in report
[0.1.0] — 2025-02-01
Added
- Initial release
- Chrome and Firefox support
- Basic TestNG integration
testfly.ymlconfiguration file discovery