Skip to content

Release Notes

What’s new in each Astur release.

See what your app talks to. New device.network reports the HTTP traffic an app makes while a test drives it, so you can assert on the call rather than just the pixels — and debug a failure without reproducing it by hand.

const capabilities = await device.network.capabilities();
test.skip(!capabilities.observe, capabilities.coverage);
await device.network.clear();
await app.login.signIn('qa@astur.dev', 'Astur12345');
const [request] = await device.network.requests({ url: '/api/session' });
expect(request).toMatchObject({ method: 'POST', status: 201 });
  • Available on Flutter Android today, via the Dart VM HTTP profiler. Covers dart:io HttpClient traffic — package:http and Dio included.
  • Ask capabilities() rather than assuming: it reports coverage per session, so one spec runs everywhere and skips with a reason where observation is unavailable.
  • Credential headers redacted and bodies capped by default; the buffer clears between tests.
  • Interception (stub/delay/fail) is not in this release — it needs an in-app adapter. capabilities().intercept says so rather than failing mysteriously.

See Network Observation for the full picture.

Fixes that were costing whole runs.

  • The UiAutomator agent had silently taken over keyboard, gestures, and element actions on Flutter sessions. Its keyboard.dismiss presses Back — which backgrounds the Flutter app and kills the Dart VM — and its gesture.tap never reaches the Flutter view at all.
  • An agent element-action failure now falls back to a coordinate tap instead of aborting the test. Fixes the native media picker on React Native Android.
  • Scroll reveals were flings, not drags: the same gesture at 300 ms flung to the end of the content, at 1200 ms it moves predictably. Search loops no longer bounce between the extremes.
  • A Flutter VM read could block for ~7 minutes; retries are now bounded by wall clock, with the deadline threaded into each request.
  • by.native({ ios, android }) — a raw escape hatch for the elements no other locator can pin down. ios takes an XCUITest predicate string; android takes a structured selector (class, text, resource id, parent/child relationships). Useful for screens with little or no accessibility metadata. See the Android and iOS guides.
  • astur test could crash with spawn EINVAL on Node 22/24 (worked fine on Node 20). It now runs Playwright directly instead of going through npx, removing the double process-indirection that triggered it.
  • Android inspector no longer flaps “UI tree unavailable”. If an earlier run crashed or was killed, its on-device agent kept holding Android’s automation slot and silently broke the next session’s UI tree. Astur now clears stale agent instrumentation and leaked port-forwards when a session starts, and tears its own down fully on close — a bad exit can’t poison the next run.
  • Small Inspector contrast fix on the code-language toggle.
  • Record the new assertions from the Inspector. The assertion composer now offers enabled/disabled/selected/focused and “match count equals” (generates toHaveCount(n)), alongside the existing text/value/label/type checks.
  • Windows crash on codegen/inspect (#10). The inspector no longer dies with Error: spawn start ENOENT right after printing its URL — browser auto-open now goes through cmd /c start on Windows, and a failed auto-open can never take the inspector down on any platform (worst case: open the printed URL yourself).
  • Codegen safety. The Inspector refuses to record a fill/expect step for a target without a stable locator (clear message instead of silently broken generated code), and count values are validated before a step is added.
  • Read element state straight from locators. textContent(), inputValue(), bounds(), count(), isEnabled(), isDisabled(), isSelected(), isFocused(), plus clear() and a Playwright-style waitFor({ state }).
  • toHaveCount assertion. await expect(device.getByRole('menuitem')).toHaveCount(3) — polls and retries like every other Astur matcher.
  • Faster multi-match queries on Android. queryAll(), count(), and device.findMany() now resolve natively on-device through the UIAutomator agent instead of dumping the whole UI tree. Older installed agent builds keep working through the previous path.
  • Faster iOS input fills. Short and secure values stay on the reliable typed path, long non-secure replacement fills can use paste, and iOS field state is verified after fill.
  • Better keyboard handling on iOS. Taps are bounded, keyboard obstruction checks are frame-based, and multi-field flows avoid unnecessary dismiss/reopen cycles.
  • WebView fills stay in web context. Inspector/codegen now remaps overlapping native WebView fields back to their DOM node, so the second fill does not accidentally route through the native iOS agent.
  • Drag-and-drop in codegen. Inspector has a Drag mode and records drag actions into generated test code.
  • Cleaner iOS WebView proxy lifecycle. Stale ios-webkit-debug-proxy processes are cleared before a new session binds to the same port.
  • Bumped public packages to 0.4.0-beta.0.
  • Regenerated package-lock.json after dependency and package version updates.
  • iOS Simulator WebView DOM. device.webContext() now drives WebView (WKWebView) DOM on the iOS Simulator as well as real devices — the same engine-agnostic API used on Android. Needs ios-webkit-debug-proxy (v1.9+) and the app setting WKWebView.isInspectable = true; Astur bridges the simulator automatically.
  • Flutter on iOS. The shared demo suite runs on the iOS Simulator against the Flutter build, read through the XCUITest accessibility tree.
  • Faster, more reliable iOS fills. Skips re-typing when a field already holds the value, types into secure/short fields (and pastes longer text), and keeps the keyboard up across multi-field forms — dismissing it only when it blocks the next tap.
  • Smoother codegen / Inspector. Device actions now pause the background screenshot/tree/WebView polling, removing the mid-fill “retrying” flicker and a WebView context drop that could happen between two fills.
  • No more stuck taps. A tap on a control covered by the soft keyboard no longer hangs.
  • Reorganized examples: shared tests live in specs/, platform configs in config/android/ and config/ios/. create-astur scaffolds to specs/ to match.
  • WebView DOM on iOS needs brew install ios-webkit-debug-proxy. The Playwright web.page (webview()) fixture stays Android-only — use device.webContext() on iOS.
  • Flutter: Android needs a debug APK + the flutter CLI + ASTUR_FLUTTER_PROJECT; iOS exposes widgets through accessibility (add Semantics(identifier:)). See Prerequisites and Platform Limits.

Beta line: APIs may still change between beta releases.