feat(browser): live update trace view on watch UI - #10296
Conversation
✅ Deploy Preview for vitest-dev ready!Built without sensitive environment variables
To edit notification comments on pull requests, go to your Netlify project configuration. |
Inline trace attempt computation in the trace artifacts component. Co-authored-by: Codex <noreply@openai.com>
Remove internal browser trace artifact wrappers from trace viewer state and components. Co-authored-by: Codex <noreply@openai.com>
Move the trace launch button into the trace artifacts component. Co-authored-by: Codex <noreply@openai.com>
Store only the selected test and trace attempt key, and derive trace data in the pane. Co-authored-by: Codex <noreply@openai.com>
Make trace attempt keys optional and let the pane fall back to the first available attempt. Co-authored-by: Codex <noreply@openai.com>
There was a problem hiding this comment.
Pull request overview
This PR implements “live” trace viewing in Vitest UI by streaming browser trace-view entries as they are recorded during a running test (watch/UI mode), rather than emitting a single accumulated trace artifact at attempt end. It updates the browser-side trace recorder to emit per-entry artifacts (including in-progress range start/end markers) and updates the UI to merge and display these incrementally, with new e2e/UI coverage.
Changes:
- Stream
internal:browserTraceartifacts incrementally (per entry) from the browser client, including range start/end markers for long-running actions andexpect.element(...). - Update Vitest UI trace viewer state/UX to merge streamed artifacts per attempt and preserve selection across live updates/reruns.
- Add/extend UI + browser integration tests and update snapshots to cover streamed traces, retries, and in-progress range rendering.
Reviewed changes
Copilot reviewed 27 out of 27 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| test/ui/vitest.config.ts | Excludes new trace-stream fixtures from UI test discovery. |
| test/ui/test/trace.spec.ts | Adds “attempts” coverage and improves trace pane open/close behavior assertions. |
| test/ui/test/trace-stream.spec.ts | New Playwright e2e test validating incremental trace streaming and range in-progress behavior. |
| test/ui/fixtures-trace/retry.test.ts | Adds retry/repeat fixture for validating attempt selection/labels in UI. |
| test/ui/fixtures-trace/basic.test.ts | Adds a second trace-enabled test for verifying trace switching behavior. |
| test/ui/fixtures-trace-stream/vitest.config.ts | New fixture config enabling browser trace view in headless mode for streaming tests. |
| test/ui/fixtures-trace-stream/range.test.ts | Fixture for validating expect.element range start/end streaming. |
| test/ui/fixtures-trace-stream/helper.ts | Gate mechanism to deterministically control fixture progression for streaming assertions. |
| test/ui/fixtures-trace-stream/basic.test.ts | Fixture for validating incremental trace step arrival and rerun reset. |
| test/browser/specs/trace.test.ts | Updates integration snapshot expectations for new range markers + artifact grouping. |
| test/browser/fixtures/trace/mark.test.ts | Adds failing page.mark group fixture to cover range start/end with failure. |
| packages/vitest/src/integrations/chai/poll.ts | Adds _poll.onStart hook to enable “in-progress” trace recording for polling assertions. |
| packages/ui/client/pages/index.vue | Passes selected trace selection into TraceViewPane (pane becomes selection-driven). |
| packages/ui/client/composables/trace-view.ts | Reworks trace selection model and merges streamed per-entry artifacts per attempt; adjusts auto-open/close semantics. |
| packages/ui/client/components/trace/TraceViewPane.vue | Accepts selection prop, derives selected trace data, and handles “no trace found”. |
| packages/ui/client/components/trace/TraceView.vue | Switches to BrowserTraceData input; adds in-progress rendering + selection preservation for live updates. |
| packages/ui/client/components/trace/TraceArtifacts.vue | New artifact UI that groups/launches trace attempts (retry/repeat) for a test. |
| packages/ui/client/components/trace/TraceArtifactLauncher.vue | Removes old single-artifact launcher component in favor of grouped trace UI. |
| packages/ui/client/components/artifacts/Artifacts.vue | Integrates new <TraceArtifacts /> and skips handling trace artifacts in the generic artifact list. |
| packages/browser/src/client/utils.ts | Removes legacy trace state from runner state and adds getBrowserRpc() helper (currently with a TS suppression). |
| packages/browser/src/client/tester/trace.ts | Changes trace recording to emit one artifact per entry via RPC; introduces range markers. |
| packages/browser/src/client/tester/tester-utils.ts | Adds action range start/end entries around provider commands to show “running” steps. |
| packages/browser/src/client/tester/runner.ts | Emits lifecycle trace entry on attempt completion; removes accumulated trace flush logic. |
| packages/browser/src/client/tester/locators.ts | Updates mark path to await async trace recording. |
| packages/browser/src/client/tester/expect-element.ts | Adds range start/end trace entries for expect.element polling assertions. |
| packages/browser/src/client/tester/context.ts | Adds range start/end trace entries for callback page.mark() groups and awaits trace recording. |
| docs/guide/browser/trace-view.md | Documents live/streamed trace behavior and in-progress steps in Vitest UI. |
| // TODO: fire-and-forget artifact recording and | ||
| // only await pending promise on test run end? | ||
| const data: BrowserTraceData = { | ||
| retry, | ||
| repeats, | ||
| recordCanvas, | ||
| entries: [entry], | ||
| } | ||
| await getBrowserRpc().triggerCommand<void>( | ||
| getBrowserState().sessionId, | ||
| '__vitest_recordBrowserTrace', | ||
| undefined, | ||
| [{ testId: task.id, data }], | ||
| ) |
There was a problem hiding this comment.
This TODO is probably doable, but it may not have much impact since it's only Vitest side artifact routine on server side.
By wrapping console.time/timeEnd, what's observed looks like this:
pnpm -C test/ui/ test-fixtures --root fixtures-trace
$ pnpm -C test/ui/ test-fixtures --root fixtures-trace
> @vitest/test-ui@ test-fixtures /home/hiroshi/code/others/vitest/test/ui
> vitest --root fixtures-trace
DEV v5.0.0-beta.2 /home/hiroshi/code/others/vitest/test/ui/fixtures-trace
UI started at http://localhost:51204/__vitest__/
stdout | retry.test.ts > repeated test
recordBrowserTraceEntry: 4.699999999254942 ms
stdout | retry.test.ts > repeated test
recordBrowserTraceEntry: 2 ms
stdout | retry.test.ts > repeated test
recordBrowserTraceEntry: 2 ms
stdout | retry.test.ts > repeated test
recordBrowserTraceEntry: 1.1000000014901161 ms
stdout | viewport.test.ts > viewport
recordBrowserTraceEntry: 5 ms
stdout | retry.test.ts > repeated test
recordBrowserTraceEntry: 5.400000002235174 ms
stdout | viewport.test.ts > viewport
recordBrowserTraceEntry: 1.5 ms
stdout | retry.test.ts > repeated test
recordBrowserTraceEntry: 1.7000000029802322 ms
✓ chromium viewport.test.ts (1 test) 54ms
stdout | retry.test.ts > retried test
recordBrowserTraceEntry: 1.6000000014901161 ms
stdout | retry.test.ts > retried test
recordBrowserTraceEntry: 2 ms
stdout | scroll.test.ts > scroll
recordBrowserTraceEntry: 6 ms
stdout | scroll.test.ts > scroll
recordBrowserTraceEntry: 1.7000000029802322 ms
stdout | retry.test.ts > retried test
recordBrowserTraceEntry: 10.699999999254942 ms
✓ chromium scroll.test.ts (1 test) 64ms
stdout | retry.test.ts > retried test
recordBrowserTraceEntry: 2.399999998509884 ms
stdout | retry.test.ts > retried test
recordBrowserTraceEntry: 1.5 ms
stdout | retry.test.ts > retried test
recordBrowserTraceEntry: 2 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 1.1000000014901161 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 0.7999999970197678 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 1.199999999254942 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 0.9000000022351742 ms
stdout | basic.test.ts > simple
recordBrowserTraceEntry: 1.199999999254942 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 1.300000000745058 ms
stdout | basic.test.ts > simple
recordBrowserTraceEntry: 0.6000000014901161 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 1.0999999977648258 ms
stdout | basic.test.ts > switch-target
recordBrowserTraceEntry: 1.199999999254942 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 1.699999999254942 ms
stdout | basic.test.ts > switch-target
recordBrowserTraceEntry: 0.8999999985098839 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 0.8999999985098839 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 1 ms
stdout | retry.test.ts > repeated retried tests
recordBrowserTraceEntry: 0.6999999992549419 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 2.399999998509884 ms
stdout | retry.test.ts > repeated test retried on later repeat
recordBrowserTraceEntry: 2.199999999254942 ms
stdout | retry.test.ts > repeated test retried on later repeat
recordBrowserTraceEntry: 7.600000001490116 ms
stdout | retry.test.ts > repeated test retried on later repeat
recordBrowserTraceEntry: 1.300000000745058 ms
stdout | retry.test.ts > repeated test retried on later repeat
recordBrowserTraceEntry: 1.199999999254942 ms
stdout | retry.test.ts > repeated test retried on later repeat
recordBrowserTraceEntry: 1.9000000022351742 ms
stdout | retry.test.ts > repeated test retried on later repeat
recordBrowserTraceEntry: 1.2000000029802322 ms
stdout | retry.test.ts > repeated test retried on later repeat
recordBrowserTraceEntry: 4 ms
stdout | retry.test.ts > repeated test retried on later repeat
recordBrowserTraceEntry: 1.800000000745058 ms
✓ chromium retry.test.ts (4 tests) 126ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.4000000022351742 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.199999999254942 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 2.2999999970197678 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.699999999254942 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 2.800000000745058 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.800000000745058 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.5999999977648258 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.300000000745058 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.2000000029802322 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 2.300000000745058 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.800000000745058 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.5 ms
stdout | basic.test.ts > pseudo-state
recordBrowserTraceEntry: 1.7000000029802322 ms
stdout | basic.test.ts > css-link
recordBrowserTraceEntry: 1 ms
stdout | basic.test.ts > css-link
recordBrowserTraceEntry: 1.300000000745058 ms
stdout | basic.test.ts > css-link
recordBrowserTraceEntry: 1.800000000745058 ms
stdout | basic.test.ts > image
recordBrowserTraceEntry: 3.199999999254942 ms
stdout | basic.test.ts > image
recordBrowserTraceEntry: 5.800000000745058 ms
stdout | basic.test.ts > image
recordBrowserTraceEntry: 3.199999999254942 ms
stdout | basic.test.ts > image
recordBrowserTraceEntry: 2.5 ms
✓ chromium basic.test.ts (5 tests) 459ms
Test Files 4 passed (4)
Tests 11 passed (11)
Start at 17:10:53
Duration 1.55s (transform 0ms, setup 0ms, import 64ms, tests 702ms, environment 0ms)
PASS Waiting for file changes...
press h to show help, press q to quit
Cancelling test run. Press CTRL+c again to exit forcefully.There was a problem hiding this comment.
More interesting stats. I found that the synchronous takeSnapshot already has comparable time cost, so fire-and-forgetting the command chain doesn't buy much. I'd defer this optimization for now. I've left the comment as such.
"takeSnapshot" vs "recordBrowserTrace"
/code/others/vitest $ pnpm -C test/ui/ test-fixtures --root fixtures-trace --ui=false
> @vitest/test-ui@ test-fixtures /home/hiroshi/code/others/vitest/test/ui
> vitest --root fixtures-trace --ui=false
DEV v5.0.0-beta.2 /home/hiroshi/code/others/vitest/test/ui/fixtures-trace
stdout | basic.test.ts > simple
[takeSnapshot] Render simple: 9.200000000186265 ms
stdout | scroll.test.ts > scroll
[takeSnapshot] Render scroll: 6.400000000372529 ms
stdout | basic.test.ts > simple
[recordBrowserTraceEntry] Render simple: 9.799999999813735 ms
stdout | basic.test.ts > simple
[takeSnapshot] vitest:onAfterRetryTask: 0.6000000005587935 ms
stdout | scroll.test.ts > scroll
[recordBrowserTraceEntry] Render scroll: 7.2999999998137355 ms
stdout | scroll.test.ts > scroll
[takeSnapshot] vitest:onAfterRetryTask: 0.599999999627471 ms
stdout | basic.test.ts > simple
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1.3999999994412065 ms
stdout | scroll.test.ts > scroll
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1.199999999254942 ms
stdout | basic.test.ts > switch-target
[takeSnapshot] Render switch target: 0.5 ms
stdout | basic.test.ts > switch-target
[recordBrowserTraceEntry] Render switch target: 1 ms
stdout | basic.test.ts > switch-target
[takeSnapshot] vitest:onAfterRetryTask: 0.39999999944120646 ms
✓ chromium scroll.test.ts (1 test) 59ms
stdout | basic.test.ts > switch-target
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.7999999998137355 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:hover: 2 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:hover: 1.7999999998137355 ms
stdout | viewport.test.ts > viewport
[takeSnapshot] Render viewport: 5.599999999627471 ms
stdout | retry.test.ts > repeated test
[takeSnapshot] renderHelper: 6.400000000372529 ms
stdout | viewport.test.ts > viewport
[recordBrowserTraceEntry] Render viewport: 11.200000000186265 ms
stdout | viewport.test.ts > viewport
[takeSnapshot] vitest:onAfterRetryTask: 0.599999999627471 ms
stdout | retry.test.ts > repeated test
[recordBrowserTraceEntry] renderHelper: 12.299999999813735 ms
stdout | viewport.test.ts > viewport
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1.099999999627471 ms
stdout | retry.test.ts > repeated test
[takeSnapshot] vitest:onAfterRetryTask: 0.5 ms
stdout | retry.test.ts > repeated test
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1 ms
✓ chromium viewport.test.ts (1 test) 81ms
stdout | retry.test.ts > repeated test
[takeSnapshot] renderHelper: 0.6000000005587935 ms
stdout | retry.test.ts > repeated test
[recordBrowserTraceEntry] renderHelper: 1.2999999998137355 ms
stdout | retry.test.ts > repeated test
[takeSnapshot] vitest:onAfterRetryTask: 0.30000000074505806 ms
stdout | retry.test.ts > repeated test
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.900000000372529 ms
stdout | retry.test.ts > repeated test
[takeSnapshot] renderHelper: 0.6000000005587935 ms
stdout | retry.test.ts > repeated test
[recordBrowserTraceEntry] renderHelper: 0.7999999998137355 ms
stdout | retry.test.ts > repeated test
[takeSnapshot] vitest:onAfterRetryTask: 0.2999999998137355 ms
stdout | retry.test.ts > repeated test
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.7999999998137355 ms
stdout | retry.test.ts > retried test
[takeSnapshot] renderHelper: 0.40000000037252903 ms
stdout | retry.test.ts > retried test
[recordBrowserTraceEntry] renderHelper: 1.2000000001862645 ms
stdout | retry.test.ts > retried test
[takeSnapshot] vitest:onAfterRetryTask: 0.2999999998137355 ms
stdout | retry.test.ts > retried test
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1 ms
stdout | retry.test.ts > retried test
[takeSnapshot] renderHelper: 0.6000000005587935 ms
stdout | retry.test.ts > retried test
[recordBrowserTraceEntry] renderHelper: 0.8999999994412065 ms
stdout | retry.test.ts > retried test
[takeSnapshot] vitest:onAfterRetryTask: 0.39999999944120646 ms
stdout | retry.test.ts > retried test
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1 ms
stdout | retry.test.ts > retried test
[takeSnapshot] renderHelper: 0.7000000001862645 ms
stdout | retry.test.ts > retried test
[recordBrowserTraceEntry] renderHelper: 1.2999999998137355 ms
stdout | retry.test.ts > retried test
[takeSnapshot] vitest:onAfterRetryTask: 0.40000000037252903 ms
stdout | retry.test.ts > retried test
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.5 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] renderHelper: 0.599999999627471 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] renderHelper: 0.8000000007450581 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] vitest:onAfterRetryTask: 0.2999999998137355 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.7999999998137355 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] renderHelper: 0.5 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] renderHelper: 1.3999999994412065 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] vitest:onAfterRetryTask: 0.20000000018626451 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] renderHelper: 0.5 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] renderHelper: 1.5 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] vitest:onAfterRetryTask: 0.2999999998137355 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.900000000372529 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] renderHelper: 0.5 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] renderHelper: 1.2000000001862645 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] vitest:onAfterRetryTask: 0.30000000074505806 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] renderHelper: 0.5 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] renderHelper: 1 ms
stdout | retry.test.ts > repeated retried tests
[takeSnapshot] vitest:onAfterRetryTask: 0.2999999998137355 ms
stdout | retry.test.ts > repeated retried tests
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.6000000005587935 ms
stdout | retry.test.ts > repeated test retried on later repeat
[takeSnapshot] renderHelper: 0.5 ms
stdout | retry.test.ts > repeated test retried on later repeat
[recordBrowserTraceEntry] renderHelper: 1 ms
stdout | retry.test.ts > repeated test retried on later repeat
[takeSnapshot] vitest:onAfterRetryTask: 0.20000000018626451 ms
stdout | retry.test.ts > repeated test retried on later repeat
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.7999999998137355 ms
stdout | retry.test.ts > repeated test retried on later repeat
[takeSnapshot] renderHelper: 0.40000000037252903 ms
stdout | retry.test.ts > repeated test retried on later repeat
[recordBrowserTraceEntry] renderHelper: 1 ms
stdout | retry.test.ts > repeated test retried on later repeat
[takeSnapshot] vitest:onAfterRetryTask: 0.20000000018626451 ms
stdout | retry.test.ts > repeated test retried on later repeat
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1.099999999627471 ms
stdout | retry.test.ts > repeated test retried on later repeat
[takeSnapshot] renderHelper: 0.5 ms
stdout | retry.test.ts > repeated test retried on later repeat
[recordBrowserTraceEntry] renderHelper: 0.8999999994412065 ms
stdout | retry.test.ts > repeated test retried on later repeat
[takeSnapshot] vitest:onAfterRetryTask: 0.09999999962747097 ms
stdout | retry.test.ts > repeated test retried on later repeat
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.6999999992549419 ms
stdout | retry.test.ts > repeated test retried on later repeat
[takeSnapshot] renderHelper: 0.5 ms
stdout | retry.test.ts > repeated test retried on later repeat
[recordBrowserTraceEntry] renderHelper: 1.2999999998137355 ms
stdout | retry.test.ts > repeated test retried on later repeat
[takeSnapshot] vitest:onAfterRetryTask: 0.2999999998137355 ms
stdout | retry.test.ts > repeated test retried on later repeat
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 0.7000000001862645 ms
✓ chromium retry.test.ts (4 tests) 88ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:hover: 0.7999999998137355 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:hover: 1 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:click: 0.6000000005587935 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:click: 1 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:click: 0.7999999998137355 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:click: 1.2999999998137355 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:click: 0.6999999992549419 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:click: 1 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:click: 0.900000000372529 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:click: 2 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:fill: 0.40000000037252903 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:fill: 1.2999999998137355 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:fill: 1 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:fill: 1.7000000001862645 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:fill: 1 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:fill: 1.5 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:fill: 0.5 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:fill: 1.2000000001862645 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] Test active: 1 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] Test active: 1.400000000372529 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:fill: 0.39999999944120646 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:fill: 1.099999999627471 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:fill: 0.40000000037252903 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:fill: 1 ms
stdout | basic.test.ts > pseudo-state
[takeSnapshot] vitest:onAfterRetryTask: 0.40000000037252903 ms
stdout | basic.test.ts > pseudo-state
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1.5 ms
stdout | basic.test.ts > css-link
[takeSnapshot] toHaveStyle: 0.599999999627471 ms
stdout | basic.test.ts > css-link
[recordBrowserTraceEntry] toHaveStyle: 0.900000000372529 ms
stdout | basic.test.ts > css-link
[takeSnapshot] toHaveStyle: 0.7999999998137355 ms
stdout | basic.test.ts > css-link
[recordBrowserTraceEntry] toHaveStyle: 1.7999999998137355 ms
stdout | basic.test.ts > css-link
[takeSnapshot] vitest:onAfterRetryTask: 0.5 ms
stdout | basic.test.ts > css-link
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1.2000000001862645 ms
stdout | basic.test.ts > image
[takeSnapshot] not.toHaveProperty: 0.599999999627471 ms
stdout | basic.test.ts > image
[recordBrowserTraceEntry] not.toHaveProperty: 2.7999999998137355 ms
stdout | basic.test.ts > image
[takeSnapshot] not.toHaveProperty: 0.5 ms
stdout | basic.test.ts > image
[recordBrowserTraceEntry] not.toHaveProperty: 1.699999999254942 ms
stdout | basic.test.ts > image
[takeSnapshot] Render image: 0.39999999944120646 ms
stdout | basic.test.ts > image
[recordBrowserTraceEntry] Render image: 1.3999999994412065 ms
stdout | basic.test.ts > image
[takeSnapshot] vitest:onAfterRetryTask: 0.20000000018626451 ms
stdout | basic.test.ts > image
[recordBrowserTraceEntry] vitest:onAfterRetryTask: 1.3999999994412065 ms
✓ chromium basic.test.ts (5 tests) 465msCo-authored-by: Codex <noreply@openai.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a2bd52d655
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| document.body.innerHTML = '<button>A</button>' | ||
| await Promise.all([ | ||
| (async () => { | ||
| await expect |
There was a problem hiding this comment.
I think this could've just been
Promise.all([expect.element(...).toBeVisible()])Without the IIFE (non-blocking)
sheremet-va
left a comment
There was a problem hiding this comment.
LGTM, merging it to unblock you in other PRs
Description
This PR updates browser trace view recording to stream trace entries as individual artifacts while tests are running, instead of waiting for a final accumulated trace artifact. The UI groups and merge trace artifacts from same test run incrementally and shows in-progress trace steps for long-running actions,
expect.elemen, andpage.mark()entries. For static html reporter output, there's no user facing change.Demo
Screencast.From.2026-05-09.17-01-26.mp4
TODO
Please don't delete this checklist! Before submitting the PR, please make sure you do the following:
pnpm-lock.yamlunless you introduce a new test example.Tests
pnpm test:ci.Documentation
pnpm run docscommand.Changesets
feat:,fix:,perf:,docs:, orchore:.