Skip to content

feat(browser): live update trace view on watch UI - #10296

Merged
sheremet-va merged 62 commits into
vitest-dev:mainfrom
hi-ogawa:feat-stream-trace-view
May 12, 2026
Merged

sheremet-va merged 62 commits into
vitest-dev:mainfrom
hi-ogawa:feat-stream-trace-view

Conversation

@hi-ogawa

@hi-ogawa hi-ogawa commented May 8, 2026 •

Copy link
Copy Markdown
Collaborator

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, and page.mark() entries. For static html reporter output, there's no user facing change.

Demo

pnpm -C test/ui/ test-fixtures --root fixtures-trace-stream
Screencast.From.2026-05-09.17-01-26.mp4

TODO

  • prototype
    • record each snapshot entry individually and verify UI reflects update
    • organize streamed entries as UI side logic and state
  • record trace range start
    • mark
    • action
    • expect.element
  • polish
    • merge trace range start/end on UI
    • in-progress step indicator
    • consolidate stream vs non-stream artifacts (likely just drop non-stream one and let UI always combine)
  • test
    • stream
    • record range in-progress
    • update snapshot
  • deslop

Please don't delete this checklist! Before submitting the PR, please make sure you do the following:

  • It's really useful if your PR references an issue where it is discussed ahead of time. If the feature is substantial or introduces breaking changes without a discussion, PR might be closed.
  • Ideally, include a test that fails without this PR but passes with it.
  • Please, don't make changes to pnpm-lock.yaml unless you introduce a new test example.
  • Please check Allow edits by maintainers to make review process faster. Note that this option is not available for repositories that are owned by Github organizations.

Tests

  • Run the tests with pnpm test:ci.

Documentation

  • If you introduce new functionality, document it. You can run documentation with pnpm run docs command.

Changesets

  • Changes in changelog are generated from PR name. Please, make sure that it explains your changes in an understandable manner. Please, prefix changeset messages with feat:, fix:, perf:, docs:, or chore:.

@hi-ogawa hi-ogawa changed the title feat(browser): live trace view feat(browser): live replay trace view on watch UI May 8, 2026
@netlify

netlify Bot commented May 8, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for vitest-dev ready!

Built without sensitive environment variables

Name Link
🔨 Latest commit 08858c9
🔍 Latest deploy log https://app.netlify.com/projects/vitest-dev/deploys/6a029a78848c7d00088f5612
😎 Deploy Preview https://deploy-preview-10296--vitest-dev.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@hi-ogawa hi-ogawa changed the title feat(browser): live replay trace view on watch UI feat(browser): live update trace view on watch UI May 8, 2026
hi-ogawa and others added 14 commits May 9, 2026 09:40
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>
Comment thread packages/browser/src/client/utils.ts Outdated
@hi-ogawa
hi-ogawa marked this pull request as ready for review May 9, 2026 07:51

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:browserTrace artifacts incrementally (per entry) from the browser client, including range start/end markers for long-running actions and expect.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.

Comment thread packages/browser/src/client/utils.ts Outdated
Comment thread packages/browser/src/client/tester/trace.ts
Comment thread packages/browser/src/client/tester/trace.ts Outdated
Comment thread packages/browser/src/client/tester/tester-utils.ts
Comment thread packages/ui/client/composables/trace-view.ts Outdated
Comment thread packages/ui/client/composables/trace-view.ts
Comment thread docs/guide/browser/trace-view.md
Comment on lines +101 to +114
// 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 }],
)

@hi-ogawa hi-ogawa May 9, 2026 •

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) 465ms

@hi-ogawa hi-ogawa added this to the 5.0.0 milestone May 9, 2026
Comment thread packages/ui/client/composables/trace-view.ts Outdated
@hi-ogawa

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/ui/client/composables/trace-view.ts
Comment thread packages/browser/src/client/tester/context.ts
Comment thread packages/browser/src/client/tester/locators.ts
Comment thread packages/browser/src/client/tester/runner.ts Outdated
Comment thread packages/browser/src/client/tester/trace.ts Outdated
Comment thread packages/browser/src/client/utils.ts Outdated
document.body.innerHTML = '<button>A</button>'
await Promise.all([
(async () => {
await expect

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this could've just been

Promise.all([expect.element(...).toBeVisible()])

Without the IIFE (non-blocking)

@sheremet-va sheremet-va left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, merging it to unblock you in other PRs

@sheremet-va
sheremet-va merged commit 78c1169 into vitest-dev:main May 12, 2026
13 of 16 checks passed
@hi-ogawa
hi-ogawa deleted the feat-stream-trace-view branch May 12, 2026 23:32
@github-actions github-actions Bot locked and limited conversation to collaborators May 28, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Trace view - Stream trace entries incrementally in watch mode so replay can look live/in-progress

3 participants