Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
7daa0f5
feat(core,backend): emit console/stdout/stderr events into trace.zip …
vishnuv688 Jul 2, 2026
36e391f
feat(app): trace-player layout parity — full workbench with top-docke…
vishnuv688 Jul 2, 2026
867187f
feat(app): reference-style timeline strip with inline playback controls
vishnuv688 Jul 3, 2026
ade42cd
refactor(shared,backend,core): derive LogLevel from runtime LOG_LEVEL…
vishnuv688 Jul 3, 2026
9120a04
fix(backend): skip tracing-group markers when reconstructing player c…
vishnuv688 Jul 3, 2026
e29070d
feat(shared,backend,app): nested action tree with failure rollup in t…
vishnuv688 Jul 3, 2026
34d92d6
feat(shared,core): trace retention policy foundations
vishnuv688 Jul 7, 2026
0851c03
feat(core,backend): carry network response bodies through the trace
vishnuv688 Jul 7, 2026
ee688f0
feat(shared,core,backend,adapters): assertions as first-class trace a…
vishnuv688 Jul 7, 2026
1dacc3f
refactor(core,adapters): consolidate trace-export orchestration into …
vishnuv688 Jul 7, 2026
84bce06
feat(core,backend): carry command result through the trace
vishnuv688 Jul 8, 2026
86f5b10
feat(core,adapters): wire tracePolicy so retain-on-failure gates trac…
vishnuv688 Jul 8, 2026
e189d63
feat(core,service): surface expect/step failures on the triggering ac…
vishnuv688 Jul 8, 2026
b91b165
feat(app): Errors tab in the workbench with jump-to-source
vishnuv688 Jul 8, 2026
7df7301
fix(service,nightwatch): distinct rerun-stable uids for Cucumber step…
vishnuv688 Jul 8, 2026
7ec3e0b
fix(core,service): collapse same-timestamp snapshots so blank frames …
vishnuv688 Jul 8, 2026
5c54ae4
chore: Added more actions to the action mapping to appear in the time…
vishnuv688 Jul 8, 2026
8f772f2
chore(examples): split wdio example into cucumber/ and mocha/ with sh…
vishnuv688 Jul 8, 2026
28c3935
chore: Update path in readme and update pnpm-lock.yaml
vishnuv688 Jul 8, 2026
18c97a3
fix(core): drop dependency-internal assertions from the trace
vishnuv688 Jul 8, 2026
625936a
fix(service): give Cucumber scenario-outline rows distinct trace groups
vishnuv688 Jul 8, 2026
d553a22
fix(service): show waits as actions and suppress their internal polling
vishnuv688 Jul 8, 2026
5640206
feat(core,adapters): capture per-test retry attempts for retry-aware …
vishnuv688 Jul 9, 2026
77fd464
feat(service,core): render expect-webdriverio matchers as trace actions
vishnuv688 Jul 9, 2026
ea03ba1
test(backend): remove skip-forever foreign-zip tests
vishnuv688 Jul 9, 2026
9087288
chore(examples): add WDIO retry harness for retry-aware trace policies
vishnuv688 Jul 9, 2026
eaa4094
docs: correct node:assert note; record retain-on-first-failure limita…
vishnuv688 Jul 9, 2026
a1c74bc
refactor(shared,adapters): consolidate adapter types into shared
vishnuv688 Jul 9, 2026
95d5e71
test(service): cover expect-webdriverio matcher capture
vishnuv688 Jul 9, 2026
1d26e0c
feat(core): per-test trace granularity foundation
vishnuv688 Jul 9, 2026
2770d57
feat(trace): per-test granularity, output folders, and test-results/ …
vishnuv688 Jul 10, 2026
3c79fee
feat(service): capture expect-webdriverio matchers as assertion actions
vishnuv688 Jul 10, 2026
f131895
feat(nightwatch): capture native browser.assert/verify as assertion a…
vishnuv688 Jul 10, 2026
2c6feff
fix(core): rate-limit repeated terminal lines and fix failLastAction
vishnuv688 Jul 10, 2026
01ad871
fix(app): real per-action duration and span-based active highlight
vishnuv688 Jul 10, 2026
f71481d
fix(app): sidebar icon alignment and resizable-pane drag
vishnuv688 Jul 10, 2026
1aac979
chore(examples): assertion + retry harnesses, chromedriver bump
vishnuv688 Jul 10, 2026
b172bef
docs: test-results/ layout, traceGranularity:'test', tracePolicy, and…
vishnuv688 Jul 10, 2026
6c1abcf
fix(core): bound the pending-snapshot settle in trace finalize
vishnuv688 Jul 13, 2026
c9b6ffe
fix(core): order trace actions chronologically, not by insertion
vishnuv688 Jul 13, 2026
9bcc6b2
fix(core): capture strict-mode node:assert and label asserts from args
vishnuv688 Jul 13, 2026
2fae5a2
fix(nightwatch): emit native asserts at test-end with real outcomes
vishnuv688 Jul 13, 2026
f6fa93c
fix(service): keep expect matchers to a single row
vishnuv688 Jul 13, 2026
e71ef02
fix(app): render assertions consistently across frameworks
vishnuv688 Jul 13, 2026
ee88a9a
fix(backend): escape test names in grep-style rerun filters
vishnuv688 Jul 13, 2026
15bc580
fix(selenium): read snapshot state via unpatched driver; forward trac…
vishnuv688 Jul 13, 2026
e1354ff
chore(selenium): bump chromedriver to ^150 for Chrome 150
vishnuv688 Jul 13, 2026
ca234b5
chore(examples): live/trace config-ladder harnesses + retry scripts
vishnuv688 Jul 13, 2026
d6af416
docs: record Nightwatch BDD per-test and WDIO assert-capture debt
vishnuv688 Jul 13, 2026
37f0778
refactor: dedupe assert-result type into shared; drop unused trace de…
vishnuv688 Jul 13, 2026
085687c
refactor(core): one findFlushableRange for the three adapters' slice …
vishnuv688 Jul 13, 2026
3f36062
refactor(service): rebuild expect-matcher capture around before/after…
vishnuv688 Jul 13, 2026
9e22455
fix(service): exclude the devtools bundle from user-frame detection
vishnuv688 Jul 13, 2026
d4deea3
fix(nightwatch): record negated native asserts (assert.not.* / verify…
vishnuv688 Jul 14, 2026
98af19a
refactor(service): extract assertion capture into AssertionTracker
vishnuv688 Jul 14, 2026
0a54e8a
docs: sync WDIO assert-capture debt to the fold model; drop fixed ent…
vishnuv688 Jul 14, 2026
c5f3f0d
feat(core): per-attempt outcome ledger + group-by-test retention
vishnuv688 Jul 14, 2026
54e3bf3
fix(service): feed the retention ledger for correct retry-aware policies
vishnuv688 Jul 14, 2026
8710e16
fix(core): fall back to metadata when a scoped retention ledger view …
vishnuv688 Jul 14, 2026
1786a25
fix(core): infer the failed attempt from a retry in the outcome ledge…
vishnuv688 Jul 14, 2026
1cafc78
fix(nightwatch): feed the retention ledger for correct retry-aware po…
vishnuv688 Jul 14, 2026
9b864c0
fix(selenium): feed the retention ledger for correct retry-aware poli…
vishnuv688 Jul 14, 2026
687bdc8
docs: retry-aware retention scope + assert-capture debt sync
vishnuv688 Jul 14, 2026
335ad06
feat(core): artifacts manifest + WDIO Allure trace/video attach
vishnuv688 Jul 14, 2026
5a39343
feat: per-test screenshot + video options with inline Allure attach
vishnuv688 Jul 15, 2026
0b84dbc
fix(core): replace polynomial-ReDoS edge-trims with a linear trimChar
vishnuv688 Jul 15, 2026
bb013fe
fix: scope screenshot/video options to the WDIO ServiceOptions
vishnuv688 Jul 15, 2026
42ff7c9
fix(app): de-duplicate live-mode Errors tab (command + reworded test …
vishnuv688 Jul 15, 2026
96347cf
feat: dense screencast filmstrip in trace mode, and fix per-test slicing
vishnuv688 Jul 15, 2026
4400a4f
fix(core): window command-less trace slices; drop dead SpecRange.snap…
vishnuv688 Jul 15, 2026
3fa3de8
fix(core): drop the sparse per-action filmstrip when a dense one is p…
vishnuv688 Jul 15, 2026
cb850cc
fix(core): cap the screencast frame buffer to bound memory
vishnuv688 Jul 15, 2026
bd1d37c
fix(core): render node:assert failures as clean Expected/Received
vishnuv688 Jul 16, 2026
b3f07b0
feat: cross-adapter Allure artifact attachment via pluggable sink
vishnuv688 Jul 16, 2026
faafc58
docs: record Nightwatch BDD per-test artifact limitation as known debt
vishnuv688 Jul 16, 2026
7dd1c95
docs: record Nightwatch BDD per-test limitation + Selenium seam extra…
vishnuv688 Jul 17, 2026
f8bfa57
feat: DOM time-travel in the trace player (mutations + field state)
vishnuv688 Jul 17, 2026
8317f9e
fix(service): re-capture DOM across reloadSession and before navigation
vishnuv688 Jul 17, 2026
394f47b
fix(core): only capture asserts fired directly by user code
vishnuv688 Jul 17, 2026
62f7c19
feat(app): trace player Transcript tab + Copy-for-LLM
vishnuv688 Jul 17, 2026
5908b6f
feat(app): trace player A11y tab + element overlay (pick-locator)
vishnuv688 Jul 19, 2026
86140ae
polish(app): float the transcript copy control as an in-corner icon
vishnuv688 Jul 19, 2026
0f00332
feat(app): bidirectional element-overlay ↔ A11y-tree linking
vishnuv688 Jul 20, 2026
ed0af0a
refactor(shared): single-source the a11y snapshot-text format tokens
vishnuv688 Jul 20, 2026
3784eed
refactor(selenium): extract per-test artifact emit into test-artifact…
vishnuv688 Jul 20, 2026
daa8917
feat(trace): input markers + Cucumber step nesting
vishnuv688 Jul 20, 2026
cfe28a1
fix(trace): drop replayed comment nodes + settle layout before overla…
vishnuv688 Jul 20, 2026
c0ed492
fix(trace): correct replay fidelity — comments, overlay alignment, zo…
vishnuv688 Jul 20, 2026
bc81058
fix(service): Gate the devtools-artifacts manifest behind an emitArti…
vishnuv688 Jul 20, 2026
fe21f45
test(service): add addCommand to browser mocks for main's getSnapshot…
vishnuv688 Jul 20, 2026
f22d912
fix: green the branch after integrating main
vishnuv688 Jul 20, 2026
b752c25
feat(trace): Selenium DOM-mutation capture + gate the artifacts manifest
vishnuv688 Jul 22, 2026
5628402
fix(core): order the trace transcript by invocation time
vishnuv688 Jul 22, 2026
49bd1c0
feat(trace): default filmstrip to on in trace mode
vishnuv688 Jul 22, 2026
32ce8d7
docs: trace mode, player features, and per-adapter support matrix
vishnuv688 Jul 22, 2026
5f08106
fix(service): warn on Chrome 150 headless input regression; attach Bi…
vishnuv688 Jul 23, 2026
4e4ff89
fix(selenium): re-inject collector after click navigations; exact-mat…
vishnuv688 Jul 23, 2026
3f4fea3
fix(core,script,service): re-anchor DOM capture across navigations an…
vishnuv688 Jul 23, 2026
185517e
fix(app): render full-page DOM snapshots with in-iframe scroll and co…
vishnuv688 Jul 23, 2026
2ca2216
chore: update pnpm-lock.yaml
vishnuv688 Jul 23, 2026
5046adb
fix(app,shared,core,service,backend): box assertion targets and WDIO …
vishnuv688 Jul 24, 2026
5ea904d
feat(app): add a copy-locator hint bar to the A11y tab
vishnuv688 Jul 24, 2026
e4a39e1
fix(service): flush buffered field edits before navigation in live mode
vishnuv688 Jul 24, 2026
f54d5ae
fix(service): box the element expect() actually resolved, not the sta…
vishnuv688 Jul 24, 2026
f1bfefe
docs: correct filmstrip default, add Errors tab + per-adapter trace m…
vishnuv688 Jul 24, 2026
c6de98d
docs: normalize package READMEs to a shared template + add CONTRIBUTING
vishnuv688 Jul 24, 2026
b82b043
docs: sync CLAUDE.md and ARCHITECTURE.md with current state
vishnuv688 Jul 24, 2026
b28de26
chore: add changeset for trace mode (minor across 6 published packages)
vishnuv688 Jul 24, 2026
acce14d
docs: update CONTRIBUTING.md
vishnuv688 Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .changeset/trace-mode-parity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
"@wdio/devtools-service": minor
"@wdio/selenium-devtools": minor
"@wdio/nightwatch-devtools": minor
"@wdio/devtools-backend": minor
"@wdio/devtools-app": minor
"@wdio/devtools-script": minor
---

Trace mode: a portable `trace.zip` artifact and first-party `show-trace` player, at parity across WebdriverIO, Selenium, and Nightwatch.

- **Trace mode** (`mode: 'trace'`) writes a portable artifact under `test-results/` with no dashboard window — `traceFormat` (`zip` | `ndjson-directory`), `traceGranularity` (`session` | `spec` | `test`), and retry-aware `tracePolicy` retention.
- **Trace player** (`show-trace`): DOM time-travel replayed from the mutation stream, an A11y tab and pick-locator element overlay, a Transcript tab with Copy-for-LLM, Errors/Console/Network/Source panels, and a scrubbable filmstrip timeline.
- **Per-test artifacts**: `screenshot` and `video` at `traceGranularity: 'test'`, a dense `filmstrip` into the trace, an `emitArtifactsManifest` index for CI, and inline Allure attachment (WebdriverIO + Selenium).
- **Assertion capture** (`captureAssertions`, on by default): `node:assert` and framework matchers render as trace action rows.

The trace format and player are identical across all three adapters; capture completeness varies per adapter (see the cross-framework support docs).
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,22 @@ packages/nightwatch-devtools/nightwatch-video-*.webm
trace-*.zip
examples/**/trace-*/

# test results
examples/**/test-results*/

# vitest --coverage output
coverage/

# pnpm state, cache, logs, and debug files
/packages/**/*.mjs

.claude

# Local Allure exploration / trace-parity comparison (throwaway — not committed)
examples/**/allure-results*/
examples/**/allure-report*/
packages/**/allure-results*/
packages/**/allure-report*/
examples/playwright-allure/
examples/wdio/cucumber/wdio.allure.conf.ts

10 changes: 8 additions & 2 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,17 @@ Contains: DOM mutation observers, page-side trace collection, a small logger. It

The execution environment is the browser, not Node, so this package cannot import from `core` (Node-only) or from non-browser-safe parts of `shared`.

### `packages/elements`

Element-detection scripts (`@wdio/elements`). Produces the per-action data that feeds the snapshot pipeline: `getSnapshot`, the depth-indented accessibility-tree serializer, and the interactable-element list, plus locator generation.

Consumed by `core` (the element-snapshot builder) and by the adapters' per-action capture (`captureActionSnapshot`). The DOM-walking scripts run in the page via `browser.execute`, so — like `script` — they avoid Node-only APIs.

### `examples/`

Per-framework demo projects used for manual verification.

- `examples/wdio/` — WebdriverIO with Mocha (default). Run via `pnpm demo:wdio`.
- `examples/wdio/` — WebdriverIO, split into `cucumber/` and `mocha/` (shared page objects in `pageobjects/`). Run via `pnpm demo:wdio` (Cucumber) or `pnpm demo:wdio:mocha`.
- `examples/nightwatch/` — Nightwatch (both vanilla and Cucumber). Run via `pnpm demo:nightwatch`.
- `examples/selenium/` — Selenium with subdirs for `mocha-test/`, `jest-test/`, `cucumber-test/`, `jasmine-test/`, `vitest-test/`. `pnpm demo:selenium` runs mocha; `pnpm --filter @wdio/selenium-devtools example:<runner>` runs the others.

Expand Down Expand Up @@ -227,7 +233,7 @@ The architecture above is the actual state of the repo. Where it diverges from t
Notable in-place pieces worth knowing about:

- `replaceCommand` has two semantics across adapters — Selenium mutates the existing entry in place (preserves `_id`/`id` continuity for chained calls); Nightwatch splices and reissues with a new `_id`. Both call the same `core/suite-helpers` factories; the storage strategy stays adapter-specific because the runner integrations differ.
- `patchNodeAssert` is wired only in `selenium-devtools` (Selenium's primary assertion style is `node:assert`). The shared helper lives in `core/assert-patcher`; Service and Nightwatch can opt in via a one-line call when they need to, but it's not auto-enabled because both communities lean on chai/expect.
- `patchNodeAssert` (via `core/assert-patcher`) is wired in all three adapters, default-on behind each adapter's `captureAssertions` option (opt out with `captureAssertions: false`), so `node:assert` — and, where the framework exposes assertion hooks, `expect` matchers — surface as trace action rows. Framework matcher libraries differ (Service taps expect-webdriverio's hooks; Nightwatch native `assert`/`verify` and Selenium's `node:assert` surface via their reconcile/patch paths), so the remaining gap is Selenium's jest-style `expect()`.
- BiDi is auto-attached in Service and Selenium. Nightwatch is opt-in via `bidi: true` and requires `webSocketUrl: true` in capabilities — historically Nightwatch users haven't all enabled BiDi by default.
- Performance API capture (`CAPTURE_PERFORMANCE_SCRIPT`) is identical across all three adapters; each wires it into its own afterCommand-equivalent path.
- Output directory for screencast videos and trace files is resolved through `core/resolveAdapterOutputDir` — adapters feed `userConfiguredDir` (WDIO honors `wdio.conf.ts`'s `outputDir`/`rootDir`), `testFilePath` (Selenium/Nightwatch), and `configPath` (Nightwatch), and the helper picks the first writable, non-`node_modules/` candidate.
Expand Down
Loading
Loading