Karate v2.0.10 Release Notes

Release Date: 2026-06-04 // 13 days ago
  • 🛠 Important Fixes

    • screenshotOnFailure: true works again; added onStepFailure hook + ErrorRunEvent #2845
    • 🔧 configure headers no longer leaks Background-set headers across requests #2846
    • Type-hint ! with an angle-bracket type in a doc-string no longer throws an NPE #2847
    • call read('f.feature') { key: #(var) } no longer throws ReferenceError: # is not defined #2849
    • startTime / endTime in the report JSON are correct again #2850
    • Java.type() resolves classes on the JUnit Platform classpath (--cp) again #2855
    • karate.tagValues aggregates all tags #2859
    • Gatling karateFeature("path", "@tag") applies the tag filter instead of treating it as a path #2870
    • Scenario Outline Example vars no longer mishandled when callonce is used in Background #2874
    • ApacheHttpClient proxy CONNECT TLS handshake uses the target host for SNI #2877
    • 🛠 StackOverflowError on circular-reference variables fixed #2880
    • 🛠 Regression on the left side of set for JSON keys with special characters fixed #2886
    • geckodriver starts again in standalone mode #2884
    • 🛠 StackOverflowError when an afterScenario hook calls a feature with a circular reference fixed #2887
    • match $.field == '#notpresent' no longer throws when the field is missing #2892
    • 📜 #() / ##() schema references inside a doc-string match parse correctly #2893
    • [*] wildcard works inside karate.match() with $ JsonPath #2894
    • set keyword works with hyphenated key paths #2896
    • Embedded expressions in feature call args are evaluated as in v1 #2897
    • 🔧 configure logging mask is applied to the scenario that triggers a callonce #2898
    • def var = $.missing yields #notpresent instead of throwing #2899
    • ✅ JUnit no longer runs the wrong tests when calling other feature files #2900
    • outputJunitXml exposed on io.karatelabs.junit6.Karate #2901
    • Type-hint suffix in an Examples table works in a match statement #2902

    🆕 New Features & Enhancements

    • 🆕 New karate-image extension — pixel image-comparison as its own ext module with a primitives API and an interactive diff lightbox in HTML reports
    • HTML report redesigned on Tailwind — timeline view, donut summary, filter chips, JSON syntax-highlighting of request/response bodies #2895
    • karate-js: ES6 classes (inheritance, super, instance/static fields), runtime strict mode, destructuring, logical-assignment (||=, &&=, ??=), RegExp named capture groups
    • 🍱 Ext SPI — pluggable extensions contributing CLI subcommands, channel factories, ext globals, and report assets
    • Multi-part karate.embed object form + defer-until-visible embed rendering
    • 👍 Driver: out-of-process iframe (OOPIF) support for CDP; W3C driver mouse via the Actions API
    • Gatling: protocol-scoped callSingle / callOnce / setupOnce caches + protocol.runner exposure
    • 🏗 JUnit 6: outputJunitXml / outputCucumberJson on the builder
    • 👍 Resource.bytes(byte[]) in-memory binary factory; CSV from byte[] support #2873
    • 🏗 Runner.Builder.getResolvedFeatures() exposed #2876

    🚀 View the complete list of all issues fixed in this release.

    Full Changelog : v2.0.9...v2.0.10

    Important : refer 2.0.0 release notes for those upgrading from 1.X

    Artifacts


Previous changes from v2.0.9

  • 🛠 Important Fixes

    • JS functions auto-coerced to Java functional interfaces (e.g. Predicate, Function) when passed to Java APIs — regression vs 1.5.2 #2837
    • 🔧 configure proxy (and other global config) propagates into features invoked via call / callonce #2839
    • HTTP traffic from karate.callSingle() is captured in the calling feature's HTML report again; config-time output also surfaced in reports #2840
    • JsonPath [*] wildcard works inside match / match each expressions (e.g. match each response..items[*].type == '#string') #2841
    • String.prototype.substr() available again, and karate.set(map) bulk form restored — v1 parity for large-codebase migrations #2842
    • SUITE_EXIT durationMillis and time stats in karate-events.jsonl no longer report negative / incorrect values #2843
    • 💅 set RHS expressions route through the same evaluator as v1, restoring parity for embedded-expression and JS-style RHS forms #2813

    🆕 New Features & Enhancements

    • passedRate exposed on SUITE_EXIT.summary and FEATURE_EXIT events for easier aggregation by external tooling #2832
    • 📜 Parser warns at parse time when the v1 @parallel tag is encountered, with a pointer to the migration docs #2838
    • Scenario names evaluate bare ${...} placeholders (in addition to <placeholder> substitution)
    • cucumber-json output flattens called sub-feature steps into the parent steps[] array
    • Driver honors the stop: false flag — skips quit and bypasses the driver pool, useful for manual / interactive debugging
    • 🚚 karate-js: json-smart dependency removed, replaced with an own strict JsonParser
    • karate-js: +51 test262 PASS — abrupt-completion sweep, RegExp.escape, lexer \v / \x fixes
    • Markup: ka:fragment (attribute-level), ka:island, ka:data-mirror, devTrace directives (K3 / K7 / K8 / K16–K22)
    • Markup: th:each strict, th:attr SyntaxError hint, th:with object-spread (...obj), per-render context.set, per-request context.setGlobal / getGlobal
    • Markup: context.redirect sends HX-Redirect automatically for htmx-originated requests; dev-mode 500 returns a useful body
    • CsrfProtection.createTemplateToken returns null when no token is available (instead of throwing)
    • netty bumped 4.2.12 → 4.2.13

    🚀 View the complete list of all issues fixed in this release.

    Full Changelog : v2.0.8...v2.0.9

    Important : refer 2.0.0 release notes for those upgrading from 1.X

    Artifacts