Changelog
All notable changes to TestFly are documented here.
[1.0.7] — 2026-10-09
Added
- Canonical
Locator.cssSelector(String): IntroducedLocator.cssSelector(String)as the primary, memorable factory method matching Selenium'sBy.cssSelectornaming conventions. - Assertion Boundary Architecture: Formalized the separation between TestFly's auto-retrying, DOM-polling Web UI assertions (
LocatorAssert,PageAssert) and general-purpose primitive assertions (delegated to AssertJ / TestNG). execution.sessionWaitSeconds(default300,0= do not wait, validated>= 0): controls how long a test waits for a free browser slot whenexecution.maxActiveSessionsis exhausted. It replaces the previously hard-coded 30-second wait.ExecutionValidator.crossCheckWarnings: prints a warning when parallel execution usesexecution.threadCountgreater thanexecution.maxActiveSessions, because the surplus threads queue for a browser slot.LoadTestDetector(internal): single place that decides whether a test is a load test (see Changed).testfly-test-authoringagent skill with per-area references (WebUI, API, TestNG, JUnit 5, Cucumber, load testing).
Changed
- Load-test detection is explicit (behavior change). The four name-based
contains("loadtest")heuristics (DriverManager,TestExecutionListener,TestFlyExtension,CucumberHooks) were replaced by a singleLoadTestDetector. A test is now treated as a load test (no WebDriver) only when it extendsBaseLoadTest, implementsLoadTestSupport, is annotated with@LoadTest/@NoBrowser, or carries the exact Cucumber tag@loadtest. Classes such asFileUploadTest,DownloadTestor anything in a package likecom.acme.uploadtestsare no longer silently denied a WebDriver. A one-time WARN is logged for classes/tags that matched the old name heuristic but not the new rules. Locatoractions (click,fill,text, ...) now auto-wait up totimeouts.explicit, re-resolving the element on each poll (also recovers from stale references) and self-healing after the timeout.isVisible(),isEnabled()andcount()stay non-waiting.DriverManager.getDriver()now explains why no driver exists (outside@Test/@PreCondition/@ConditionProvider, e.g. in@BeforeMethod) and where to move the setup.- The session-slot timeout error now names both
execution.maxActiveSessionsandexecution.sessionWaitSeconds. - Jackson modules are pinned through
jackson-bom2.21.7 (previously onlyjackson-databindwas pinned, at 2.21.6), so transitive and optional Jackson modules stay on one version. - The JaCoCo agent is now attached to the Surefire JVM (
argLineis@{argLine} ...), sotarget/jacoco.execand the coverage report are produced bymvn verify. - GPG signing moved from the default build into the
releaseMaven profile:mvn verify/mvn installneed no key; releases use-Prelease.
Deprecated
Locator.css(String): Deprecated in favor ofLocator.cssSelector(String). It continues to delegate seamlessly to prevent breaking existing code.
Fixed
getByText()returned the outermost ancestor (html/body/wrapperdiv) instead of the element holding the text; it now returns only the innermost match.exact()uses the same logic.- Load tests: HTTP status codes are now recorded in
statusCodes(transport failures use the synthetic code-1),LoadScenario.assertStatus(n)now fails when any other status occurs (it previously asserted againstassertNoStatusof a different code), andextract()works for scenarios without a feeder. - HTML report: the report data embedded in the page is escaped for a
<script>context (<, U+2028, U+2029), so failure messages and test data can no longer inject markup or close the script block; template placeholders are now substituted in a single pass, so substituted values are never re-scanned. DriverManagersession permits: a permit is now returned exactly once per driver, including whendriver.quit()throws and on every failure path of driver creation (a permit leak that could exhaustmaxActiveSessions).DriverManager.recreateDriver()now also replaces a deadper-suitedriver (it was kept in the suite registry), andquitAllSuiteDrivers()releases only the permits that were actually held.OpenApiValidatorpasses the URI path (not the full URL) and the responseContent-Typeheader to the validator, which fixes "No API path found" failures and response body validation.
Security
.github/workflows/release.ymlhardened: the release version is validated as a whole string (no newline or script injection) and read only through the environment, never interpolated into scripts; the release commit must be reachable frommain; publishing is gated on thereleaseGitHub environment; the pom version must equal the release version (tag pushes are no longer rewritten); tests run once, GPG signing is enabled only through-Prelease, and the tag/GitHub Release is created at the verified commit.
Documentation & Specifications
- Engineering Specs Modernization: Modernized root
docs/specifications (internals.md,public-api.md,architecture.md,testng-listeners.md) to reflect the Java 21 LTS baseline,SmartTriageEngine,FuzzyHealingEngine, and assertion boundaries. - Documentation Site Sync: Updated guides for semantic locators, assertions, and self-healing across both English and Turkish documentation locales.
- Agent Knowledge Graph Sync: Registered
[[wiki/assertion-system]], updated architecture and WebUI wikis, and synchronizedMAP.md. - Documentation audit (EN + TR): corrected the Maven coordinate to
io.github.hakanngulthroughout, rewrote examples that did not compile against the real API, aligned the load-testing docs with the real DSL (load(path).users().rampUp().hold(),LoadTestFeeder,@LoadTestattributes), and corrected claims aboutWaitEngine, Kubernetes/distributed load tests, Allure and CI setup. Install guides now state which version is on Maven Central and which version this checkout is. - Agent guidance consolidated:
AGENTS.mdis the single entry point (GEMINI.md,PRODUCT.mdandfeatures/features-report.mdremoved),ROADMAP.mdandCONTRIBUTING.mdupdated, and obsolete planning documents underdocs/retired.
Tests
- Unit suite grew from 1362 to 1444 tests, adding regression coverage for HTML report escaping,
DriverManager(permit accounting, per-suite recreate, slot wait),LoadTestDetector,JdkLoadEngine,OpenApiValidator,ExecutionValidator,Locatorauto-wait and test-id configuration isolation.
[1.0.6] — 2026-09-29
Added
- Smart Flakiness Triage (
SmartTriageEngine): Local heuristic analyzer integrated intoTestExecutionListenerthat inspects exception hierarchies to categorize failures (SYSTEM_FLAKY,APPLICATION_BUG,NEEDS_INVESTIGATION) without LLM token cost. - Fuzzy Self-Healing (
FuzzyHealingEngine): Local, zero-token heuristic fallback healing using Levenshtein distance against DOM candidates and attribute tokens before escalating to external LLMs; no fixed latency is guaranteed. - Auto-POM Page Knowledge System: Autonomous page element discovery and local semantic intent resolution with continuous learning cache (
PageKnowledge). - Sequenced Collections on Locators: Added
first()andlast()navigation methods toLocatorleveraging Java 21 sequenced collections. BaseJUnit5ApiTest: Native REST API testing base class with fullapi()client support for JUnit 5 Jupiter suites.NavigationSupportHelpers: Added comprehensive window management, multi-tab switching, and browser navigation helpers.- HTML Report Log Filters: Interactive INFO and DEBUG log level visibility toggles in the report timeline.
Changed
- Java 21 LTS Modernization: Framework baseline and compiler upgraded to Java 21 LTS (
--release 21), adopting Pattern Matching forinstanceof, exhaustive switch expressions, and stream.toList()across the repository. - Native Selenium By Interoperability (
Locator extends By):Locatornow directly extends Selenium'sorg.openqa.selenium.By, enabling 100% transparent interoperability with native Selenium APIs (driver.findElement(locator)). - Clean API Refactor: Refactored
Locatorto remove redundant prefix methods (ofCss,inputValue,getValue) to embrace a unified, zero-boilerplate API. - Support Interface Completeness: Ensured 100% method delegation parity for all
Supportinterfaces (ApiSupport,BrowserSupport,LocatorSupport), fully wrapping the internal engines. - Null-Safe Actions:
Locator.type()andLocator.append()are completely null-safe; passingnullor""gracefully clears the element without throwing exceptions.
Performance
- Virtual Threads in Load Testing: Leveraged Project Loom
Executors.newVirtualThreadPerTaskExecutor()inJdkLoadEnginefor ultra-scalable, lightweight load testing. - Video Recording Memory Optimization: Video recorder stores raw byte frames and performs lazy decoding upon test failure, significantly reducing heap overhead during long runs.
Fixed & Hardened
- Guaranteed Driver Cleanup: Added JVM shutdown hooks and
@AfterAlllistener execution to guarantee browser process termination even on abnormal exits. - Thread-Safe Bootstrap: Hardened framework bootstrap initialization against race conditions during concurrent suite startup.
[1.0.5] — 2026-09-12
Added — Interactive Web Recorder & Web Studio (testfly record)
- Chrome Companion & Injected Extension-less Recording:
- Launch isolated Google Chrome with automated Chrome DevTools Protocol (CDP) script injection (
testfly record <url>). - Real-time Server-Sent Events (SSE) streaming of clicks, coalesced keystrokes, and assertions directly to local web studio (
:8765). - Interactive toolbar for one-click visual assertions (
isVisible,isEnabled,hasTextwith exact and contains matching).
- Launch isolated Google Chrome with automated Chrome DevTools Protocol (CDP) script injection (
- 4-in-1 Multi-Framework Java Codegen:
- Live code compilation for Page Object Model (
BasePage), standalone TestNG (BaseTest), JUnit 5 (BaseJUnit5Test), and Cucumber BDD (.feature). - Compiler safeguards preventing syntax errors from Java reserved keywords (e.g.
continueElement). - 1-click "Save to Project" writes production-ready classes directly into
src/test/java/.
- Live code compilation for Page Object Model (
- Architectural Decision Record (ADR-001):
- Documented design decisions, protocol boundaries, and security model for the companion studio and MCP integration.
Added — Model Context Protocol Server (testfly mcp)
- Protocol-Native AI Browser Automation:
- Built-in MCP server exposing 88 live browser automation tools to AI coding assistants (Claude Code, Cursor, GitHub Copilot, JetBrains AI).
- Enables LLMs to inspect live DOM trees, query the accessibility tree, verify layouts, and author robust TestFly tests without hallucinated selectors.
Added — Smart Test Sharder (SmartTestSharder)
- LPT Bin-Packing Test Distribution:
- Implements the Longest Processing Time (LPT) bin-packing algorithm to balance test suite execution across distributed CI worker nodes.
- Minimizes pipeline idle time and achieves optimal parallelization based on historical test duration metrics.
Added — Load & Performance Testing Module
- Dual-Engine Load Testing Architecture:
- Gatling Engine: High-concurrency subprocess execution, automatic simulation generation, stdout/log parsing, and full interactive Gatling HTML report generation linked directly in TestFly reports.
- Lightweight Virtual Thread Engine: Zero-dependency JDK virtual thread engine for developer machines and fast CI/CD feedback loops.
- Fluent Load Testing DSL:
- Declarative scenario builder via
load(path).users(n).rampUp(duration).hold(duration).run()orloadScenario("name").step(...).run(). - Available in
BaseLoadTest(the load-test base class; it starts no browser).
- Declarative scenario builder via
- Annotation-Driven Execution (
@LoadTest):- Configure load test parameters (
users,rampUp,hold,cooldown,engine,baseUrl) directly at test class or method level.
- Configure load test parameters (
- Data Feeders (
LoadTestFeeder):LoadTestFeederfactoriescsv,json,random,uuid,sequence, andconstant, plusfeedCsv/feedJsonshortcuts on the scenario.
- SLA & Latency Assertions (
LoadTestAssert):- Fluent assertions for percentiles (P50, P90, P95, P99), max response time, min throughput (RPS), error rate thresholds, and HTTP status distributions.
- Unified Multi-Channel Reporting:
- TestFly HTML Report: Dedicated "Load Testing" tab with interactive KPI cards (Users, RPS, Total Requests, P95, Error Rate), response time percentiles breakdown, status code distribution, and clickable link to Gatling interactive HTML reports.
- Allure Report Adapter: Adds load test parameters (Users, Engine, RPS, P95, Error Rate), interactive link to Gatling report, summary markdown attachment, and full subprocess execution log attachment.
- ReportPortal Adapter: Sends load test Markdown summary log entries and attaches subprocess execution logs to the test step.
Added — Feature Switchboard
features:master on/off panel — master switchboard intestfly.ymlto effortlessly enable/disable optional subsystems (ai,recording,tracing,network,healing,visual,performance,flakiness,quarantine,testManagement,notifications,consoleErrors).FeatureGate(io.testfly.config.FeatureGate) — unified programmatic gate for feature status.ai.enabledmaster AI switch (defaulttrue) — single switch to gate all AI capabilities.
Changed — HTML Report & Security Hardening
- HTML Report Cupertino Lab Redesign — Modernized report layout with Cupertino Lab aesthetic, improved table density, responsive failure triage cards, and dark mode optimization.
- Flakiness Radar — Visual stability scoring across consecutive test runs.
- Security Sanitization — Added safe DOM rendering and XSS prevention helpers (
escapeHtml,sanitizeUrl,safeText) in HTML report generation. - Repository Security Attributes — Added
.gitattributesto mark vendored libraries and generated files, preventing false positive scanner alerts. - Tolerant
testfly.ymlparsing — Unrecognized configuration keys are logged as warnings rather than crashing startup. - Fail-fast on disabled features — Direct programmatic invocations of disabled features fail clearly rather than silently skipping.
- Homepage Modularization — Separated static data and snippets into
homeData.jsto ensure low code entropy and clean React architecture.
[1.0.4] — 2026-09-07
Added — Agentic Testing & Autonomous AI
- AI-Driven Advanced Self-Healing —
DomPrunercompresses complex web DOM trees to under 8K tokens by stripping non-semantic and decorative nodes.AiHealingEnginesynthesizes replacement locators with LLM reasoning when static fallbacks are exhausted and caches healed locators in.testfly/healed-locators.json; cache hits avoid another AI request but do not guarantee zero execution time. - AI-Powered Self-Remediation & Auto-PR Patches —
SourceCodeLocatormaps runtime failures back to consumer test and page object sources.RemediationPatchGeneratorgenerates clean, unified git diff.patchfiles intotarget/remediations/for single-commandgit applyresolution. - Semantic Natural Language Assertions —
satisfiesAi(condition)andviolatesAi(condition)onPageAssertandLocatorAssert, plusassertWithAi(condition)convenience method inAssertionSupport. Features single-evaluation anti-throttle guard and soft-assertion compatibility. - Goal-Oriented Dynamic Steps (
act) & Compile & Freeze Caching — High-level natural language goal execution viaact(String goal)inActionSupport(BaseTest,BasePage,BaseJUnit5Test,BaseCucumberSteps) andbyIntent(String intent)inLocatorSupport. Compiles user intents into deterministic Selenium action plans and freezes them into.testfly/action-cache.jsonfor instant replay. - Dropdown & Navigation Action Primitives —
ActionType.SELECTpicks a<select>option by visible text through Selenium'sSelect;ActionType.NAVIGATEcallsdriver.get(), passing absolute URLs through and resolving relative paths againstexecution.baseUrl.NAVIGATEbypasses locator parsing, so agent plans can move between pages without a target element. Both are advertised to the LLM byActionCompiler.buildPrompt.
Added — Video Recording
- Playwright-style retain-on-failure recording — Web UI tests are recorded to MP4 and kept only when a test fails; passing tests discard the video automatically
- Real MP4 encoding — videos encoded as H.264 MP4 and embedded as HTML5
<video>players in both TestFly HTML report and Allure report - Headless viewport auto-config — 1920×1080 viewport automatically applied for headless Chrome/Edge when
startMaximizedis set
Added — Network Mocking Framework
- Comprehensive network mocking and assertions — CDP-based request interception with pattern matching, response stubbing, and assertion API for verifying captured requests
Changed
- SessionCache rename —
browser.SessionCache→BrowserSessionCache,precondition.SessionCache→PreconditionSessionCacheto eliminate naming ambiguity .envresolution priority —DotEnvLoadernow resolves${VAR}placeholders with explicit priority:.envfile > shell environment > system property (-D). AddedDotEnvLoader.fromDotEnv(key)to query.envvalues directly. Removeddotenv-javadependency;.envparsing is handled internally.
Added — API Testing Improvements
- HTTP-level retry (
api.retry.*) — config-driven retry for transient failures and status codes (502/503/504); exponential backoff; step-logged withWARN - Per-request timeout override —
apiClient().get("/report").timeout(120).send() - Query parameter builder —
.queryParam("page", 1).queryParam("limit", 10)with URL encoding - Request/Response interceptors —
ApiClient.addRequestInterceptor()andaddResponseInterceptor(); global, thread-safe - Cookie jar —
.withCookies()captures and auto-sends cookies across requests; thread-local - Response time assertion —
res.assertDurationLessThan(500)andassertDurationLessThan(2, TimeUnit.SECONDS) - Header assertions —
assertHeader("Content-Type", "application/json"),assertHeaderPresent("X-Request-Id") - Body regex assertion —
assertBodyMatches("\\d{4}-\\d{2}-\\d{2}")with dotall mode - JSON structure assertions —
assertJsonExists("$.path"),assertJsonNull("$.field"),assertJsonArraySize("$.items", 3) - Configurable truncation limit —
api.truncationLimit: 1000(default 300) - Self-healing locator cache — healed locators persisted across runs for faster recovery
api:
retry:
enabled: true
maxAttempts: 3
backoffMs: 500
retryOnStatus: [502, 503, 504]
retryOnException: true
Added — Report Portal Enhancements
- Auto run type detection — suite test classes scanned;
BaseApiTest→ "API", otherwise → "Web";reporting.reportportal.type: api|web|auto - Enriched launch name —
<name> — <API|Web> | <env> | <timestamp> - Enriched description — run type, context-aware base URL (Web→execution.baseUrl, API→api.baseUrl), environment, user@hostname, CI platform + build info
- CI platform detection — GitHub Actions, Jenkins, GitLab CI, CircleCI, Travis CI, Bitbucket Pipelines, Azure Pipelines
- JUnit 5 → Report Portal —
agent-java-junit5dependency +ReportPortalJUnit5Bridgereflection bridge; JUnit 5 tests push results to RP automatically
reporting:
reportPortal:
enabled: true
launch: "Demo Web - Dev"
type: auto
Fixed
- OAuth2 token cache race condition — double-checked locking prevents thundering herd on expired tokens
- RP launch naming — context-aware base URL selection based on run type (Web vs API)
- Dark theme text visibility — CSS safety nets for all Prism token types; fixed invisible code block text; dark mode overrides for search dropdown, tabs, collapsible, badges, footer
- AI model defaults and validation —
ai.modelis optional and defaults per provider (claude-haiku-4-5-20251001for Claude,gemini-2.5-flashfor Gemini); sanitized Gemini model names against injection - Session cache isolation & script safety —
BrowserSessionCacheandPreconditionSessionCacheclear localStorage before restore and pass items safely via WebDriver script arguments - PreCondition retry vs DataProvider isolation — fixed premature session cache invalidation during multi-row
@DataProviderruns; cache is now only invalidated on true retries (result.wasRetried()) - LocatorAssert failure propagation — restrict caught wait exceptions to
TimeoutExceptionso unexpected browser/WebDriver faults are not masked - Locator withText matching —
Locator.withTextdefaults to case-insensitive substring matching and respects the exact-match parameter - ReportPortal credential guard — skip RP registration when credentials are missing instead of failing the suite
- Headless viewport — automatically configure 1920×1080 viewport for headless Chrome/Edge when
startMaximizedis set
[1.0.0] — 2026-08-20
Changed
- Project rebrand to TestFly — complete identity migration:
- Maven coordinates:
io.testfly:testfly:1.0.0(historical entry: legacy group ID; the current coordinate isio.github.hakanngul:testfly) - Java namespace:
io.testfly - Config file:
testfly.yml - Public API annotation:
@TestFlyApi - Report artifacts:
testfly-report.htmlandtestfly-metrics.json
- Maven coordinates:
Security
- API credentials moved to
${ENV_VAR}placeholders sourced from environment or.envfile.
Build
- Integration tests split into
src/test/java/io/testfly/integration/withmaven-failsafe-plugin qualityMaven profile: JaCoCo, SpotBugs, Checkstyle, PMD
[0.24.0] — 2026-08-15
Fixed
execution.parallelvalidation — now delegates to TestNG'sXmlSuite.ParallelMode;testsandinstancesmodes accepted
[0.23.0] — 2026-07-18
Added
waitForAttribute(By, attribute, value)— exact attribute matchwaitForUrlMatches(String regex)— URL regex matchwaitForTextMatches(By, String regex)— element text regex match
[0.22.0] — 2026-06-26
Fixed
- Report overwrite with multiple test engines —
testfly.reports.dirsystem property honored by all report outputs
[0.21.0] — 2026-06-25
Added
- Accessibility-first locators —
getByRole,getByText,getByLabel,getByPlaceholder,getByTestId,getByAltText,getByTitle getByRole(Role)— 36 WAI-ARIA roles with implicit + explicit matching;.withName(),.withLevel()(corrected from the original count of 38)toBy()escape hatch — returns synthesized SeleniumBy
getByRole(Role.BUTTON).withName("Submit").click();
getByText("Welcome").isVisible();
getByTestId("checkout-btn").click();
[0.20.0] — 2026-06-21
Added
- TestRail —
@TestRailCase("C1234")auto-pushes results; multiple IDs; auto-creates runs - Xray —
@XrayTest("PROJ-123")for Cloud (OAuth2) and Server/DC (Basic auth) - Zero extra dependencies — both use
java.net.http.HttpClient
[0.19.0] — 2026-06-20
Added
- Gradle build support —
testImplementation 'io.testfly:testfly'+test { useTestNG() }(historical entry: legacy group ID; the current coordinate isio.github.hakanngul:testfly) - JUnit XML auto-detects Maven vs Gradle directory layout
FrameworkVersion.get()readsMANIFEST.MF(works with both build tools)
[0.18.0] — 2026-06-20
Added
- Accessibility assertions (axe-core) —
accessibility().withTags("wcag2a","wcag21aa").withLevel(Impact.SERIOUS).run() - axe-core 4.10.2 bundled in JAR — no CDN dependency
[0.17.0] — 2026-05-19
Added
- Performance assertions (Core Web Vitals) —
assertPerformance().lcp().isBelow(2500).cls().isBelow(0.1) performance.captureOnEveryTest: true— ⚡ metrics strip in HTML report
[0.16.0] — 2026-05-17
Added
- Test quarantine —
testfly-quarantine.ymlfor permanent test skipping; TestNG, JUnit 5, Cucumber support
[0.15.0] — 2026-05-12
Added
- External
@TestDatasources —csv:,excel:(Apache POI),db:(JDBC) prefixes TestClock—clock().set("2030-01-01T00:00:00Z")freezes browser time;clock().advance()fast-forwards
[0.14.0] — 2026-05-04
Added
- BrowserStack —
execution.mode: browserstack; W3C capabilities; mobile devices; session URL in report - Sauce Labs —
execution.mode: saucelabs; three regions
[0.13.0] — 2026-05-04
Added
- Email verification —
mailbox().waitForEmail(to("[email protected]")); Mailhog, Mailtrap, Outlook, IMAP email.assertSubject(),email.assertBodyContains(),email.extractLink()
[0.12.0] — 2026-05-03
Added
@NoBrowser— skip WebDriver creation; ideal for DB/API-only tests
[0.11.0] — 2026-05-03
Added
- Multi-session testing —
withSession("alice", () -> { ... }); named browser sessions - Database assertions —
db().assertRowExists(),db().query(),db().scalar(); plain JDBC
[0.10.0] — 2026-05-03
Added
@Retryablefor JUnit 5 —InvocationInterceptorwith driver recreation@Retryablefor Cucumber — full scenario rerun from step 1
[0.9.0] — 2026-05-02
Added
- JUnit 5 support —
TestFlyExtension(@ExtendWith); full lifecycle management WebDriverinjectable as test method parameterBaseJUnit5Testbase class;TestFlyLauncherListenervia ServiceLoader
[0.8.0] — 2026-05-02
Added
- Cucumber integration —
BaseCucumberTest+BaseCucumberSteps; auto driver lifecycle per scenario CucumberStepLoggerpipes Gherkin steps into HTML report
[0.7.0] — 2026-04-16
Added
- Self-healing locators — fallback through
id,name,text,class,data-testid;⚠ healedbadge - AI failure analysis — root-cause + fix suggestion in HTML report via AI model
- Flakiness prediction — STABLE/WATCH/HIGH classification; Flakiness Radar card
[0.6.0] — 2026-04-16
Added
- Trace viewer — self-contained HTML trace per failed test; step timeline with screenshots
- Visual regression —
VisualAssert.assertScreenshot()pixel comparison; auto-baseline - Device emulation —
DeviceEmulator.emulate("iPhone 14"); 6 built-in profiles - Network interception —
NetworkMock.stub(pattern)via CDP - Fluent Locator API —
find(css)chainable;filter(),withText(),nth() - Web-first assertions —
assertThat(By)withisVisible,hasText,count
[0.5.0] — 2026-04-07
Added
- Shadow DOM helpers —
shadowFind,shadowClick,shadowPierce - Angular/React waits —
waitForAngular(),waitForReactHydration() - Enhanced HTML report — pass rate gauge, donut chart, dark mode, search
- Allure adapter — opt-in Allure 2 JSON results
- Slack / Teams notifications — webhook-based post-suite summary
@DependsOnApi— skip test if endpoint unreachable
[0.4.0] — 2026-03-28
Added
- Schema validation —
res.assertSchema("schemas/user.json") @UseAuthannotation — apply named auth strategy from config- OAuth2 client credentials —
ApiAuth.oauth2()with token caching
[0.3.0] — 2026-03-25
Added
BaseApiTest— pure API testing without browserApiClient— fluent HTTP client (JDKHttpClient)ApiResponse— JSONPath extraction, fluent assertionsApiAuth— Bearer token and Basic auth strategiesScenarioContext/SuiteContext— thread-local and global state stores
[0.2.0] — 2026-03-22
Added
@TestData— annotation-driven test data from JSON/YAML; env overrides- Browser matrix — run every test on every browser in one
mvn test SessionCache— cross-thread session reuse- Soft assertions — collect failures, flush at test end
[0.1.0] — 2026-03-16
Added
BaseTest— test base class with framework lifecycleBasePage— page object base:click,type,getText,withinFrameWaitEngine— centralized explicit waitsLocator— fluent auto-waiting locator chainStepLogger— named steps with timestamps and screenshotsDriverManager— thread-local WebDriver lifecycletestfly.yml— convention-over-configuration YAML- HTML report — tabbed dashboard, pass rate gauge, retry badges
- JUnit XML + CI auto-detection (GitHub Actions, Jenkins, CircleCI, GitLab CI)
- Build quality gates — pass-rate and flaky-test thresholds
- Plugin system — SPI-based
TestFlyPlugin, custom driver providers, report adapters @PreCondition— session-aware pre-conditions with cookie caching@Retryable— per-method retry with config- Chrome + Firefox providers with auto download directory
- Console error collector, download manager, iFrame helpers, alert handling