Repository navigation
Releases
Releases · hardkoded/e2e-dotnet
v0.8.0
What's Changed
- docs: remove stale not-ported lines from COMPATIBILITY.md by @kblok in #657
- Strip the XCUIElementType prefix when normalizing mobile node kinds (upstream 1133) by @kblok in #659
- Keep exact: false and the role's article in MCP locate advice (upstream #1147) by @kblok in #658
- Port test filters: the filter seam, change detection, and report fields (upstream #1206, #1345) by @kblok in #662
- Bound each mobile input by the operation's remaining budget (upstream #1073) by @kblok in #660
- Port screen.scrollUntilVisible and locator.scrollUntilVisible by @kblok in #664
- Add Get started and Samples sections to the docfx site by @kblok in #663
- Refuse an empty verdict summary at the done tool (upstream createVerdictTool) by @kblok in #666
- Replace DocFX docs with an Astro Starlight site by @kblok in #667
- Extract StreamRedactor and HoldFrom as upstream does (#656) by @kblok in #679
- Drive the InputBudget tests with a fake clock (fixes flaky test, #668) by @kblok in #683
- Port the web Browser fixture's onDialog and waitForDownload, with sanitizeFilename and artifactPath by @kblok in #686
- TestMu web: session name, Windows 11 default, blank-credential check by @kblok in #671
- Port the migrate-to-e2e skill, coding-agents and Limrun docs (upstream 1109) by @kblok in #672
- Retry model requests and replay reasoning on Google and Bedrock (refs #652) by @kblok in #678
- Create FUNDING.yml by @kblok in #688
- Port the trace cache identity: key the cache by traceCacheKeyHash (upstream identity.ts) by @kblok in #687
- Mobile provider parity: provider recording, device.locator, in-flight commands (#650) by @kblok in #697
- Locate in the engine: WebEngine and DocumentEngine implement LocateAsync by @kblok in #698
- Record Observation and Engine events, observation size and revision, and the skip reason of an agent step by @kblok in #700
- Sync docs wording with upstream: queued MCP call cancel and new-tab media values by @kblok in #689
- Config: app.command, readyUrl and port 0 (refs #645) by @kblok in #699
- Read a web locate under the wait's remaining budget by @kblok in #703
- Port the session store and the session-1 schema (refs #649) by @kblok in #707
- Bedrock: sign each retry attempt again by @kblok in #704
- Port browser.locator, browser.frameLocator and expect(browser).toHaveClass by @kblok in #710
- Expect the Dariten local-demo banner by @kblok in #715
- Serve the docs site under /e2e-dotnet on Vercel by @kblok in #713
- Retire GitHub Pages for the docs site by @kblok in #716
- Resolve Bedrock credentials through the AWS credential chain by @kblok in #719
- Keep agent worktrees out of the Entire Brain seed by @kblok in #724
- Fix three intermittently failing Linux CI tests by @kblok in #723
- Rewrite text downloads through the secret ledger (#682) by @kblok in #722
- Document that a failed explore cleanup joins the outcome by @kblok in #717
- Replay thoughtSignature on a Gemini plain text part by @kblok in #726
- Track a cancelled mobile command until the daemon finishes it by @kblok in #718
- Launch Firefox and WebKit through WebEngineOptions.BrowserName by @kblok in #725
- Name the engine in the report target (IEngine.Name) by @kblok in #727
- Fix timing flakes in the filter-deadline tests by @kblok in #730
- Record observationRevision on explore findings by @kblok in #729
- Add a dark marketing homepage to the docs site by @kblok in #720
- Port the agent-judgment-2 response grammar and its schemas (#706) by @kblok in #731
- Stop CodeRabbit requesting changes; remove Entire Brain files by @kblok in #732
- Keep a location on the app's own origin as its path (appLocation) by @kblok in #755
- Port writeHostTrace and the open-host-trace tests (#705) by @kblok in #758
- Port e2e init: scaffold config, install skill, register MCP by @kblok in #761
- Record Browser and Device fixture calls as harness steps by @kblok in #762
- Document that Gemini schemas go unconverted, as the AI SDK does (#676) by @kblok in #763
- Config: maxObservationBytes and maxInputTokens with observation cutting by @kblok in #711
- Reference src/E2E and src/E2E.NUnit from the TodoMvc sample by @kblok in #764
- Replay parity: verifyEndState waitMs, recorded end wait, viewport share of a scrolled list by @kblok in #712
- Port app.identity, app.environment, launchArguments and permissions (#695) by @kblok in #759
- Report the screen size as Observation.Viewport from the mobile and Windows engines by @kblok in #768
- Attribute a tool's nested model generation to its step (AiTrace ExecuteTool) by @kblok in #770
- Live scroll parity: re-find a scrolled list by its place by @kblok in #769
- Fix flaky Replaces_a_dropped_playwright_browser test (ECONNREFUSED) (#767) by @kblok in #771
- ObservationFeed: keep the rendered look under the current redactor (#765) by @kblok in #773
- Extract retryingObserve and checkStepClock from the agent (agent/phases.ts) by @kblok in #774
- Keep a web ref strict only when its locator matched alone (#766) by @kblok in #772
- Phases follow-up: Partial_ ports, guard deadline, fake clock (after #774) by @kblok in #776
- Fail the attempt with a route or dialog handler error that no step follows (settleAttempt) by @kblok in #777
- Extract ArtifactStore and createAttemptArtifacts from upstream (#721) by @kblok in #778
- Port the e2e init prompts (engines, gateway, skill and MCP locations, confirmation) by @kblok in #779
- Share the app command across holders and stop it at the end of the run (#696) by @kblok in #780
- Port the run-wide ModelUsage accumulator; rename the per-call DTO to ModelCallUsage (breaking) by @kblok in #781
- Hide the screenshot caret with a stylesheet (upstream #1288) by @kblok in #784
- Guard the waitFor capture with the step clock (#775) by @kblok in #783
- Add Kind and Redaction to StoredArtifactLink and port the putLink tests by @kblok in #785
- Exit with the cleanup error's code when a passed test's cleanup failed (upstream #1233) by @kblok in #786
- Add Browser.ClearCookiesAsync (upstream #1046) by @kblok in #789
- Add locator filter hasNot and hasNotText (upstream #1334, #1037) by @kblok in #790
- Skip booted devices another agent-device session holds (upstream #1379) by @kblok in #787
- Point the upstream parity check at docs-site/ by @kblok in #791
- Add a self-healing tests section; name skipped upstream docs (upstream #1430, #1444, #1441, #1397) by @kblok in #792
- Bump agent-device to 0.21.33 (upstream #1420) by @kblok in #794
- Fix the three review threads left open on #792 by @kblok in #800
- Grant browser pe...
v0.7.0
What's Changed
- Audit COMPATIBILITY.md against upstream main (ee901b3) by @kblok in #463
- Accept zero for EAS minute limits and name the bad option by @kblok in #464
- Match Android test ids without their package prefix in DeviceLocator by @kblok in #465
- Redact explore finding text and cap reportedFindings by @kblok in #466
- Observe responses before the first navigation by @kblok in #467
- Add OnAction hook to agent.act by @kblok in #469
- Resolve locators in the engine, so an unreadable Android snapshot keeps polling by @kblok in #474
- Show what each step did, the hook it ran in, and what the app logged on the trace page by @kblok in #460
- Add Browser.UnrouteAllAsync by @kblok in #476
- Keep artifact screenshots after a secret fill by @kblok in #477
- Fail a model GitHub Copilot does not serve with MODEL_UNAVAILABLE, naming the model by @kblok in #480
- Record the agent's turns of a step and show them on the trace page by @kblok in #481
- Pass the engine's measured keyboard state to executors by @kblok in #482
- Add Screen.TreeAsync and Screen.DebugAsync by @kblok in #478
- Explore: accept severity 3.0 and record a cancelled step by @kblok in #485
- Name an attempt's directory with resultSegment by @kblok in #486
- Tell what became of each step's recording and which model recorded it by @kblok in #488
- Test the stored model attribution of a cache entry and document it in the debugging guide by @kblok in #489
- Explore: surface a cancel in the finding tool as a cancel by @kblok in #490
- Failure evidence: look at the app before the test's own teardown by @kblok in #491
- Show the prompt cache split and the cost of each model call in the agent step table by @kblok in #492
- Read an empty iOS text field as empty, not as its placeholder by @kblok in #494
- Port the OAuth errors and token-endpoint tests by @kblok in #495
- Trace page: tell every attempt of a test on one page by @kblok in #497
- ToHaveScreenshotAsync fails with POLICY_DENIED when masking is unproven by @kblok in #498
- Make the missing-session DevFlow test independent of the clock by @kblok in #502
- Read the OAuth token response through readJsonBody by @kblok in #500
- Attempt directories: tell two tests with one title apart by their class by @kblok in #504
- Fix the flaky timed-out body test in ExpectSoftInARunTests by @kblok in #505
- MediaEmulationTests: wait for a popup's media instead of reading it at load by @kblok in #506
- Report: add the report-1 schema and the atomic report writer by @kblok in #507
- Test AgentDiscovery.WaitForStatusAsync deadline and never-answers paths by @kblok in #508
- Record StreamRedactor as not ported by @kblok in #509
- Port the secret-never-reaches-the-model test from upstream 5b6a731e by @kblok in #510
- Follow upstream 5b6a731e in the explore tests by @kblok in #511
- Build the report's run-level parts: targets, summary, usage, limits, status, VCS by @kblok in #514
- Port the merged unit tests from upstream fe2c3450 by @kblok in #516
- Port the agent and cache test changes from upstream adcfc2ba and c9445ce6 by @kblok in #517
- Mask a password inside a closed shadow root in artifact screenshots by @kblok in #519
- EngineLocateTests: give the retry test a deadline that fits its poll sleeps by @kblok in #520
- COMPATIBILITY: list the upstream test-only tests the port does not run by @kblok in #522
- Give the step start observation Truncated and Path by @kblok in #525
- Port the engine cancellation guards and merged web tests from upstream a13e119c by @kblok in #521
- Remove port tests whose upstream it was deleted or merged by @kblok in #526
- Extract StaleOr and port the upstream staleOr tests by @kblok in #530
- Stop the test host crash from a connection reset before accept by @kblok in #529
- Write report.json after every attempt by @kblok in #531
- Bind the OAuth callback server to the IPv4 loopback address by @kblok in #535
- Remove DecideTraceReplayThroughTheActTests, which have no upstream it by @kblok in #536
- Wait through an iOS app not running yet after a launch by @kblok in #537
- Port the tests that need a report now that report.json exists by @kblok in #541
- Expose the closed session report as E2ESession.Report() by @kblok in #538
- Classify a content-filter refusal as MODEL_REFUSED by @kblok in #539
- Report: a blocked run reads exit code 2 by @kblok in #545
- Reopen the app inside the app.restart and app.clearState step by @kblok in #546
- Prefix a failed or blocked verdict message with the api and status by @kblok in #547
- Return a typed Report from E2ESession.Report() by @kblok in #550
- Make the cleanup budget test independent of machine speed by @kblok in #548
- Skills: start each test near its screen and fix a failed test from its trace page by @kblok in #555
- TestMu: take upstream's Edge flag, idleTimeout and project defaults, and capability validation by @kblok in #556
- Mobile: start the iOS keyboard-dismissing drag clear of controls by @kblok in #557
- Add a CodeRabbit upstream parity check (warning) by @kblok in #559
- Pin agent-device 0.21.29 (upstream 07eb481) by @kblok in #561
- Pick the engine of a config target in e2e explore and e2e mcp by @kblok in #560
- Make the CodeRabbit Upstream parity check an error by @kblok in #563
- Launch a device's pinned app before the first observation in explore and mcp by @kblok in #562
- Make CodeRabbit request changes while findings are open by @kblok in #564
- Bump Microsoft.Playwright to 1.64.0 by @kblok in #565
- Support hosted device providers in e2e explore and e2e mcp by @kblok in #566
- Keep a timeout a timeout in StaleOr and NavigationStaleOr by @kblok in #572
- Note truncated agent observations in the report (upstream #1301) by @kblok in #575
- Show the test line for each action in an e2e mcp session by @kblok in #579
- Keep the request prefix a Claude thinking block is bound to by @kblok in #578
- Resolve test lines through the engine's LocateAsync by @kblok in #580
- Extract openStandaloneAttempt and port upstream's host lifecycle tests by @kblok in #582
- Make a zero git budget deterministic by @kblok in #583
- docs: record why upstream's off-site iframe text is not ported (#1333) by @kblok in #594
- Run the drafted test lines of an e2e mcp session in a test run by @kblok in #584
- docs(skills): rerun one test with the replay cache on while iterating by @kblok in #595
- test(cli): bound the drafted run's output reads and escape i...
v0.6.0
What's Changed
- Write a trace page for a failed attempt, and an agent step table under E2E_DEBUG by @kblok in #451
- Take --trace, --video, --debug, and --ai-trace on e2e explore by @kblok in #454
- Turn off the CodeRabbit docstring coverage check by @kblok in #455
- Record video on the mobile engine by @kblok in #458
- Keep the screen, a screenshot, and the closest nodes of a failed attempt, and carry details on errors by @kblok in #459
- Pin an agent to a test or class, and add test-level agent context by @kblok in #461
- Add MobileAppTest for NUnit and xUnit, and read the device app from e2e.config.json by @kblok in #462
Full Changelog: v0.5.0...v0.6.0
v0.5.0
What's Changed
- Stop OAuthHandler from refreshing for an already cancelled request by @kblok in #342
- Show the selected text of a focused field in the agent snapshot by @kblok in #344
- Fix the whitespace that the format check rejects in Screen.cs by @kblok in #349
- Add a Contents list to long skill references by @kblok in #350
- Release browsers, drivers, and processes when a start or a dispose fails by @kblok in #351
- Fix replay-cache and test-adapter correctness defects by @kblok in #352
- Add a checklist for reviewing .NET and C# code by @kblok in #355
- Check vendor and user text before it reaches the terminal, the browser, or a recording by @kblok in #353
- Surface a caller's cancel as a cancel, and return a malformed tool call to the model by @kblok in #354
- Document that a cancelled model call stops waiting for a token refresh by @kblok in #356
- Read the first recognized ARIA role token by @kblok in #357
- Read OPENCODE_API_KEY in e2e models opencode-console by @kblok in #358
- Print the e2e login URL on one copyable line by @kblok in #359
- Name the failed end-state checks in end-mismatch details by @kblok in #360
- Omit the Next.js route announcer from observations by @kblok in #361
- Hold keys and modifiers with Keyboard.DownAsync and UpAsync by @kblok in #362
- Let E2E_CACHE_DIR replace cache.dir by @kblok in #363
- Define an atomic ActAsync goal and route each job to one reference in the skill by @kblok in #365
- Locator reads wait for their match until the action timeout by @kblok in #366
- Point a locate role name that matches nothing at the node's text by @kblok in #367
- Keep mobile device commands on the selected device after closeApp by @kblok in #368
- Document the Limrun provider in the setup reference by @kblok in #377
- Split an act step into its harness and an executor by @kblok in #375
- Pin agent-device 0.21.25 so Android emulators can fold by @kblok in #374
- Stop the settle tests from hanging on a lost timer advance by @kblok in #378
- Let model requests carry images by @kblok in #373
- Name the action in the cache detail when a replay stops at an action by @kblok in #372
- Redact secrets in poll, screenshot, waitFor, soft-failure and cause messages by @kblok in #371
- Evict a replayed cache entry when a later assertion fails on the app by @kblok in #370
- Emulate dark mode and reduced motion in the web engine by @kblok in #369
- Let judgments read a masked screenshot by @kblok in #379
- Rename partial tests that keep an upstream name by @kblok in #389
- Let a test project bring its own step executor by @kblok in #380
- Record the windowed-list row key as not applicable by @kblok in #390
- Add the create-verification-skill skill by @kblok in #391
- Name STEP_NOT_AWAITED as not applicable; negation window already ported by @kblok in #392
- Extract the functions upstream's tests call, and review every PR by @kblok in #393
- Extract SerializeLedger from the act context by @kblok in #395
- Extract CreateGrammarTools and CreateVerdictTool by @kblok in #394
- Extract NodeReading and ReadingShape and port the reading tests against them by @kblok in #396
- Extract replayTrace and ReplayHost from the act harness by @kblok in #398
- Keep replay's secret and scroll-to-text handling as before the extraction by @kblok in #404
- Ship the Limrun provider as its own package, E2E.Limrun by @kblok in #406
- Lease hosted browsers through an IBrowserProvider by @kblok in #408
- Ship the EAS provider as its own package, E2E.Eas by @kblok in #407
- Let a browser provider serve downloads and record the browser by @kblok in #409
- Add E2E.TestMu: TestMu AI hosted browsers by @kblok in #410
- Add an Appium device client for TestMu mobile devices by @kblok in #411
- Connect to the TestMu grid with the Playwright protocol by @kblok in #413
- Add E2E.Kernel: run web targets in Kernel's hosted Chromium by @kblok in #412
- Fix Limrun devices refusing every command with LEASE_SCOPE_MISMATCH by @kblok in #414
- Run the MobileApp sample tests on a Limrun iOS simulator by @kblok in #415
- Keep the prepare failure when the hosted device release fails by @kblok in #416
- Pack the Release build in CI instead of building ten more times by @kblok in #417
- Explain how to pick a device when several simulators match by @kblok in #418
- Fix the MobileApp sample on Limrun without E2E_MOBILE_APP_PATH by @kblok in #419
- Add Explore.ExploreAsync: explore an app toward a goal by @kblok in #422
- Read the iOS screen title from the bar identifier only when the bar shows it by @kblok in #421
- Decide trace replay in one place, as upstream does by @kblok in #420
- Add a mobile reference to the e2e-dotnet skill by @kblok in #423
- Extract StepTraceSession and port the step-cache tests against it by @kblok in #425
- Record steps through TraceRecorder, as upstream does by @kblok in #424
- Hold modifier keys on agent tap and double tap by @kblok in #430
- Add the e2e explore command by @kblok in #433
- Accept trace and video settings in the config by @kblok in #434
- Record the steps of an attempt and bound the step ledger by @kblok in #437
- Time the phases of a test with E2E_DEBUG by @kblok in #435
- Record every model call with E2E_AI_TRACE by @kblok in #438
- Stop the throwing-read poll test from failing on a busy machine by @kblok in #439
- Record video on the web engine by @kblok in #436
- Collect the screen after an action and the environment on the web engine by @kblok in #442
- Trace calls to the DevFlow agent, and pack the package on release by @kblok in #441
- Drive a MAUI app through the DevFlow agent by @kblok in #440
Full Changelog: v0.4.1...v0.5.0
v0.4.1
What's Changed
- Test reasoning replay and the MarkLatest cache mark in the model providers by @kblok in #335
- Port the loop guard, soft failure, and OAuth refresh waiter unit tests by @kblok in #336
- Document the API and behavior changes the skill and docs missed by @kblok in #337
- Suggest the nearest config key like upstream does by @kblok in #343
- Publish E2E.Mobile to NuGet by @kblok in #345
Full Changelog: v0.4.0...v0.4.1
v0.4.0
What's Changed
- Name the locale and time zone test after its upstream it by @kblok in #214
- Port the secret ledger near-miss and path-form tests by @kblok in #215
- Name the budget test after its upstream it by @kblok in #216
- Port two unit/config tests and match upstream on secret collisions and discovery by @kblok in #217
- Port the missing step-cache tests, and keep a passing step passing when its end look fails by @kblok in #218
- Say which tests may have no upstream it by @kblok in #227
- Normalize and validate the app base URL by @kblok in #228
- Port the header scoping test and drop duplicate port-only tests by @kblok in #229
- Port the testbed pages and the tests that need them by @kblok in #230
- Port the agent config, entry prompt, and verdict unit tests by @kblok in #231
- Port the web read-node, glyph name, label, and closed-shadow tests by @kblok in #242
- Port the web unit tests and match upstream option and error checks by @kblok in #243
- Port the web lifecycle, CDP attach, protected app, and nested frame tests by @kblok in #244
- Force a verdict when the model repeats itself by @kblok in #246
- End a too-large model request with CONTEXT_OVERFLOW by @kblok in #247
- Replay the model's reasoning between turns by @kblok in #248
- Port the web visibility, evaluate, and observation-metadata tests by @kblok in #245
- Retry an act verb on a node that went stale by @kblok in #249
- Redact the basic-auth credential a Secret password becomes by @kblok in #255
- Read and fill contenteditable editors, and let a generic secret fill one by @kblok in #251
- Add e2e install to install Playwright browsers by @kblok in #250
- Redact the part of a secret a cut name or text ends with by @kblok in #254
- Read the text selected in the focused field by @kblok in #252
- Require ports to follow upstream's structure and names by @kblok in #262
- Reduce link targets in observations to origin and path by @kblok in #253
- Port the scripted, screenshot, skip-after-failure, and secrets tests by @kblok in #261
- Port the agent act tests, and let the model see a failed navigate by @kblok in #260
- Port the ledger, reading, secrets, login, help, config, and engine error tests by @kblok in #259
- Match upstream reads for textContent and inputValue by @kblok in #266
- Redact session secrets in failed matcher messages by @kblok in #265
- Use upstream's names and file layout for code already on main by @kblok in #268
- Port the agent judgment, policy, trace cache hand-off, and named agent tests by @kblok in #270
- Port the replaced-node, engine contract, engine secret, and soft failure tests by @kblok in #271
- Replay Anthropic thinking blocks and chat-completions reasoning by @kblok in #274
- Show href, test id and placeholder in the agent snapshot by @kblok in #276
- Shrink the history and retry once after a context overflow by @kblok in #277
- Port the mobile snapshot model by @kblok in #275
- Report STEP_TIMEOUT when an observation outlives the waitFor deadline by @kblok in #278
- Add the mobile engine, the agent-device client, and the device pool by @kblok in #279
- Test the all-dot target name and tighten the session host tests by @kblok in #280
- Port upstream unit tests for text, trace store, secrets and visible queries by @kblok in #281
- Sync the mobile engine with upstream 62d55249 by @kblok in #282
- Port the device surface: actions, device fixture, and tools by @kblok in #286
- Cut text like upstream's bound by @kblok in #284
- Sync the mobile engine with upstream fc906441 by @kblok in #306
- Port the EAS Simulators device provider by @kblok in #307
- Port more upstream unit tests: params, filters, polls, SSE, logins by @kblok in #285
- Port the Limrun provider for mobile tests by @kblok in #309
- Port the remaining unit tests for press, provider hints, tool loop, and trace cache by @kblok in #287
- Mark the newest Anthropic message for caching only in a tool loop by @kblok in #301
- Set MarkLatest in the Anthropic cache tests that #301 broke by @kblok in #310
- Logout returns false when no login is stored by @kblok in #296
- Add a MAUI sample app and mobile sample tests by @kblok in #308
- Rethrow a hard stop raised by a replayed action by @kblok in #298
- Send the extract schema as a shape by @kblok in #297
- Retry a poll when the matcher complains about the value type by @kblok in #299
- Strip whole ANSI escape sequences from CLI model text by @kblok in #300
- Stop CI hanging when Chrome leaves a pipe open by @kblok in #305
- Share one endpoint listing between callers in DelegatingModel by @kblok in #302
- Make the RedactFragments memory test stable by @kblok in #312
- Type a surrogate pair as one keystroke in pressSequentially by @kblok in #303
- Stop the scroll settle tests from failing at random under load by @kblok in #314
- Offer project tools to the agent and expose the mobile tools through them by @kblok in #315
- Run a step live under strict cache mode when its recording stops at a project tool by @kblok in #320
- Add a solution for the MAUI sample app and its tests by @kblok in #321
- Give extract its own system prompt by @gkizior in #319
- Build 0.4 previews so the mobile packages publish as 0.4.0 by @kblok in #334
Full Changelog: v0.3.0...v0.4.0
v0.3.0
What's Changed
- Port browser.route: fulfill, continue, fallback, and abort by @kblok in #141
- Fail operations on a hung page at the action timeout by @kblok in #76
- Build the secret redactor once per secret set by @kblok in #149
- Document E2E_HEADLESS by @kblok in #165
- Read the text of a labelled status with ToHaveText by @kblok in #84
- Add init scripts that run before the page's own scripts by @kblok in #72
- Serve e2e mcp: the four fixed tools and the guide by @kblok in #147
- Run the tests that waited on #82 by @kblok in #167
- Recover a persistent CDP session with reconnectEndpoint by @kblok in #88
- Redact secrets from names and test ids in replay cache entries by @kblok in #73
- Stop replays passing when the recorded effect did not happen by @kblok in #77
- Match text inside inline elements with GetByText by @kblok in #85
- Run the AttemptSession tests without a Playwright driver or real-time budgets by @kblok in #169
- Update the skill and docs in the same PR as the API by @kblok in #142
- Fail a strict-cache step whose recording sits under an old key by @kblok in #71
- Infer row headers and name nodes by upstream's rules by @kblok in #69
- Read visibility as the page renders it by @kblok in #79
- Port upstream's settle policy, and read a step's delta from the screen it acted on by @kblok in #174
- Keep only tests that port an upstream test, laid out like upstream by @kblok in #90
- Deny GetAttribute on a secure field by @kblok in #101
- Fail waitFor(detached) at once on several matches by @kblok in #104
- Fail toHaveValue on an element that is not a form control by @kblok in #102
- Deny AllTextContents on a secure field by @kblok in #100
- Stop a negated matcher from reading after its deadline by @kblok in #103
- Send OpenCode provider options and cache keys as upstream does by @kblok in #180
- Fail login early on read-only credentials and cancel device-code start by @kblok in #181
- Report unopened pages, cancelled opens, and classified errors with the right code by @kblok in #183
- Redact fragments of a secret in any case, whitespace, and base64 by @kblok in #182
- Name the status and body of a failed model request by @kblok in #185
- Run poll tests on a fake clock; cancelled and cut-off matcher polls end like upstream by @kblok in #186
- Show a node's text, purpose, and clean control characters in the screen text by @kblok in #187
- Replay cache recordings across record ids, fragments and form-encoded values by @kblok in #184
- Keep the test id out of attributes and stale a ref with a twin by @kblok in #188
- Keep text out of the snapshot budget and scope shadow landmarks by @kblok in #189
- Strict cache replays on retries and never writes the cache by @kblok in #190
- Fix locator descriptions, GetByRole names, waitFor sets, and display-value filters by @kblok in #191
- Print the observed value escaped in matcher failures by @kblok in #192
- Wait for a control's checked state after check and uncheck by @kblok in #195
- Redact the screen location shown to the model by @kblok in #196
- Fail a test that skips itself after a failed soft assertion by @kblok in #197
- Read value only for form fields and accept any-case aria states by @kblok in #193
- Remove pull request trigger from docs workflow by @kblok in #201
- Read a painted aria-hidden node as visible by @kblok in #198
- Keep locator text reads whole after the snapshot change by @kblok in #194
- Read a sentence whole across its inline links and emphasis by @kblok in #199
- Cancel the ChatGPT code exchange when sign-in is interrupted by @kblok in #205
- Add DblClickAsync as an alias of DoubleTapAsync by @kblok in #206
- Compare screenshots with ToHaveScreenshotAsync on the web engine by @kblok in #207
- Read screenshot PNGs with SkiaSharp, which needs no license by @kblok in #208
- Add browser.goto and the expect(browser) URL and title matchers by @kblok in #209
- Walk a snapshot of the child frames while observing a page by @gkizior in #210
- Build 0.3 previews by @kblok in #212
- Open live sessions in e2e mcp by @kblok in #211
- Ship the e2e tool as one package that can open sessions by @kblok in #213
New Contributors
Full Changelog: v0.2.0...v0.3.0
v0.2.0
What's Changed
- Fix replay misses on list pages by @kblok in #46
- Let the agent double-tap a control by @kblok in #45
- Add a TodoMVC sample that ports Playwright's example by @kblok in #47
- Drop the engine version from the replay cache key by @kblok in #50
- Port every upstream test, and run the real-model tests before pushing by @kblok in #80
- Fail an assertion when one repeated value contradicts it by @kblok in #66
- Add locale and time zone options to the web engine by @kblok in #67
- Let check pass when the click replaces the control by @kblok in #68
- Lay out ported tests like upstream's test files by @kblok in #89
- Send the identity headers on every model request by @kblok in #75
- Install only the Chromium build the run launches by @kblok in #70
- Document Locale and TimezoneId in the skill by @kblok in #143
- Set a relative cookie URL on the base URL, and wait for responses by @kblok in #74
- Allow only http(s) and about:blank on navigation by @kblok in #78
- Fail a locator action before app.open with APP_NOT_OPEN by @kblok in #133
- Add an xUnit v3 fixture and sample by @kblok in #145
Full Changelog: v0.1.4...v0.2.0