Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
429c544
test: add cross-adapter capture-parity harness (Layer A)
vishnuv688 Jul 27, 2026
009928b
test: add cross-adapter verification harness (Layer A + Layer B)
vishnuv688 Jul 27, 2026
f6797e7
test(visual): enforce WebDriver Classic to avoid flaky BiDi shadow-DO…
vishnuv688 Jul 27, 2026
4e2dff5
fix(nightwatch): generate cucumber traces (build the hooks + capture …
vishnuv688 Jul 27, 2026
f193aac
feat(nightwatch): capture native asserts in cucumber traces
vishnuv688 Jul 27, 2026
2766e27
test(visual): pin device-scale-factor so HEADED matches headless base…
vishnuv688 Jul 27, 2026
252c889
test(harness): add live-mode parity layer + record-live recorder
vishnuv688 Jul 28, 2026
6aa9b7c
test(harness): finalize Layer B — re-mint visual baselines + live-das…
vishnuv688 Jul 28, 2026
fcf2b0b
fix(capture): recover DOM capture on documents that miss script injec…
vishnuv688 Jul 28, 2026
e4a6507
test(app): add WDIO component tests for the Lit dashboard
vishnuv688 Jul 29, 2026
52ac526
test(harness): drop the fixture-driven verification layers
vishnuv688 Jul 29, 2026
e1a1275
refactor(shared): make the trace.zip layout one definition
vishnuv688 Jul 29, 2026
c603d31
test(core): table the traceGranularity × tracePolicy grid
vishnuv688 Jul 29, 2026
8a5687b
test(core): assert the artifacts manifest per trace config
vishnuv688 Jul 29, 2026
4ab67ca
test(app): use path aliases and the real demo URLs in component specs
vishnuv688 Jul 29, 2026
59d3125
test(app): cover Tier 1 components with rendering specs
vishnuv688 Jul 29, 2026
ace6f85
test(app): cover Tier 2 components with rendering specs
vishnuv688 Jul 29, 2026
56422d3
fix(app): stop the Errors tab mangling assertion failures
vishnuv688 Jul 30, 2026
914d94b
test(app): cover the compare panel
vishnuv688 Jul 30, 2026
88035a2
test(app): derive sidebar row state instead of asserting it
vishnuv688 Jul 30, 2026
d5ec4ca
test(app): harden panel and player specs, unit-test their helpers
vishnuv688 Jul 30, 2026
1ed0d96
test(app): add an attachable mode to the component-test runner
vishnuv688 Jul 30, 2026
aeaa536
fix(backend,core,service): keep run state across a run's worker sockets
vishnuv688 Jul 30, 2026
d72eca0
fix(backend): match the runner's own full-title form in rerun filters
vishnuv688 Jul 30, 2026
c5450b6
fix(app): window the compare panel to a preserved test's own uid
vishnuv688 Jul 31, 2026
51bd224
fix(ci): commit the vitest config the root gitignore was swallowing
vishnuv688 Jul 31, 2026
9dcbcbb
chore(elements): Added @wdio/elements package context
vishnuv688 Jul 31, 2026
0488dcc
fix(app): derive test outcome one way instead of four
vishnuv688 Jul 31, 2026
29fbed6
fix(app): resolve one failure site per step, strip the ESC byte
vishnuv688 Jul 31, 2026
6793d3d
fix(app): show the Compare tab only for the selected test
vishnuv688 Jul 31, 2026
656050a
fix(app): head each Errors row with what failed
vishnuv688 Jul 31, 2026
9f7f882
fix(app): render the empty-state copy the panels pass
vishnuv688 Jul 31, 2026
8b7b5c0
fix(app): tear down the player's listeners, show the viewport
vishnuv688 Jul 31, 2026
0314345
fix(app): honour the theme per instance, send elapsedTime, nest legally
vishnuv688 Jul 31, 2026
5d0f475
fix(app): stop two event details resolving to any
vishnuv688 Jul 31, 2026
09f5a04
ci: run the component suite, cap workers at two
vishnuv688 Jul 31, 2026
c5136e4
test(app): cover the sidebar shell, shortcuts and DataManager
vishnuv688 Jul 31, 2026
1da6655
docs: correct claims the code no longer supports
vishnuv688 Jul 31, 2026
6b272c1
build: make tsc a gate that actually runs
vishnuv688 Jul 31, 2026
a6bd883
ci: run typecheck and the coverage floor
vishnuv688 Jul 31, 2026
f22ec1d
test: pin the coverage denominator to the source tree
vishnuv688 Jul 31, 2026
908e871
fix(tests): clear the 28 errors the dead type gate had accumulated
vishnuv688 Jul 31, 2026
61acd2e
fix(app): give a suite no verdict until a child settles
vishnuv688 Jul 31, 2026
038f934
refactor(app): drop CollectedError.command and the comments that over…
vishnuv688 Jul 31, 2026
81c40cc
refactor(app): one elapsed-time rule, one theme source
vishnuv688 Jul 31, 2026
fd7a23c
fix(app): explain the empty panels instead of drawing a skeleton forever
vishnuv688 Jul 31, 2026
20e1136
fix: point two ambient globals at the canonical shared types
vishnuv688 Jul 31, 2026
2941dcc
fix(app): keep the window a step's remaining bound gives you
vishnuv688 Jul 31, 2026
b4aed39
fix(app): let a running test be stopped, and offer the control the tr…
vishnuv688 Jul 31, 2026
3fbd334
fix(app): wire the sidebar selection into the selected-test context
vishnuv688 Jul 31, 2026
ddfa2d0
fix: capture and replay text-only DOM changes
vishnuv688 Jul 31, 2026
aa4dcb7
fix: recognise the native a11y header instead of parsing it as a node
vishnuv688 Jul 31, 2026
881fc27
fix: one request-type vocabulary across capture, wire and UI
vishnuv688 Jul 31, 2026
89760bb
docs: correct the component-testing inventory
vishnuv688 Jul 31, 2026
53a85b4
test(app): pin that an Errors row is not a control
vishnuv688 Jul 31, 2026
18f9c6e
fix: update pnpm-lock.yaml
vishnuv688 Jul 31, 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
4 changes: 3 additions & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ body:
- WebdriverIO (@wdio/devtools-service)
- Nightwatch (@wdio/nightwatch-devtools)
- Selenium WebDriver (@wdio/selenium-devtools)
- None — @wdio/elements used standalone
validations:
required: true

Expand All @@ -40,7 +41,7 @@ body:
id: devtools-version
attributes:
label: DevTools package version
description: The version of the adapter package above (check your package.json or lockfile).
description: The version of the package you selected above (check your package.json or lockfile).
placeholder: e.g. 0.4.2
validations:
required: true
Expand Down Expand Up @@ -72,6 +73,7 @@ body:
options:
- Dashboard UI (rendering, controls, rerun/stop)
- Captured data (network, console, screencast, trace)
- Element snapshot / locators (getSnapshot, getElements, accessibility tree)
- Backend / server (connection, websocket, crashes)
- Test launch / lifecycle (hooks, session, capabilities)
- Not sure
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/feature-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ body:
options:
- Dashboard UI
- Capture / reporting core
- Element snapshot / locator API (@wdio/elements)
- WebdriverIO adapter
- Nightwatch adapter
- Selenium adapter
Expand Down
1 change: 1 addition & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

- [ ] `shared` (types and contracts)
- [ ] `core` (framework-agnostic capture/reporting)
- [ ] `elements` (published element/snapshot API — `@wdio/elements`)
- [ ] `service` (WebdriverIO adapter)
- [ ] `nightwatch-devtools` (Nightwatch adapter)
- [ ] `selenium-devtools` (Selenium adapter)
Expand Down
86 changes: 83 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ on:
- v[0-9]+.[0-9]+.[0-9]+*
pull_request:

permissions:
contents: read

jobs:
build:
runs-on: ubuntu-latest
Expand All @@ -23,9 +26,9 @@ jobs:
cache-name: cache-pnpm-modules
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.node-version }}-${{ hashFiles('**/pnpm-lock.yaml') }}
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.node-version }}-
${{ runner.os }}-build-${{ env.cache-name }}-
- uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
with:
version: 10.26.1
Expand All @@ -36,5 +39,82 @@ jobs:
run: pnpm lint
- name: 📦 Bundle
run: pnpm -r --workspace-concurrency=1 build
# Four tsc programs — see the `typecheck` script. Runs before the tests
# because it is fast and its failures are cheaper to read.
- name: 🔎 Typecheck
run: pnpm typecheck
# `test:coverage`, not `test`: same specs plus the coverage floor, ~8s
# more. Without it the thresholds in vitest.config.ts gate nothing.
- name: 🧪 Run Tests
run: pnpm test
run: pnpm test:coverage

# Separate job because these are the only tests that need a real browser, and
# they parallelise with `build` instead of extending it. No bundle step: the
# specs and packages/app/src reach @wdio/devtools-shared through its source
# exports, so Vite compiles everything from source. Chrome comes preinstalled
# on the runner image; wdio fetches the matching driver itself.
component-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Use Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: .nvmrc
- name: Cache pnpm modules
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
env:
cache-name: cache-pnpm-modules
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
- uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
with:
version: 10.26.1
run_install: false
- name: Install dependencies
run: pnpm install --frozen-lockfile
# Two workers, not the runner default: each carries a Vite server plus a
# Chrome, and past 2 the heaviest specs time out under that contention.
- name: 🧩 Component Tests
run: pnpm test:ui --maxInstances 2
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed

# The component suite again, instrumented. Separate from `component-tests` so
# a coverage-only flake can never mask a real component failure:
# instrumentation costs ~16% wall clock and loses roughly one spec per run to
# a BiDi navigate timeout — a different one each run, which is why this is
# report-only for now. It measures packages/app/src, the rendering layer
# vitest's denominator excludes on purpose (a node test cannot import a Lit
# element). Drop continue-on-error and add thresholds once that flake is fixed.
component-coverage:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Use Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: .nvmrc
- name: Cache pnpm modules
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
env:
cache-name: cache-pnpm-modules
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
- uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
with:
version: 10.26.1
run_install: false
- name: Install dependencies
run: pnpm install --frozen-lockfile
# Two workers, not the runner default: each carries a Vite server plus a
# Chrome, and past 2 the heaviest specs time out under that contention.
- name: 📊 Component Coverage
env:
COVERAGE: '1'
run: pnpm test:ui --maxInstances 2
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,13 @@ dist-ssr
*.njsproj
*.sln
*.sw?
# Scratch scripts and dumps dropped at the repo root. Real root-level config
# has to be un-ignored by name: a new one is otherwise silently never added,
# and CI then runs with different settings than everyone's checkout.
/*.ts
/*.json
!/vitest.config.ts
!/tsconfig.dts.json
*.tgz
examples/wdio/wdio-*.json
examples/wdio/wdio-*.webm
Expand Down Expand Up @@ -55,6 +60,5 @@ examples/**/allure-results*/
examples/**/allure-report*/
packages/**/allure-results*/
packages/**/allure-report*/
examples/playwright-allure/
examples/wdio/cucumber/wdio.allure.conf.ts

6 changes: 4 additions & 2 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,11 @@ The execution environment is the browser, not Node, so this package cannot impor

### `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.
The WDIO-typed element-detection API (`@wdio/elements`): `getSnapshot`, `getElements`, the accessibility-tree and interactable-element readers. Unlike `shared` and `core` this package **is** published, so its exported names are public API.

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.
Imports from: `core`. The script bodies, serializers, types, and locator generation all live in `core` (`element-scripts.ts`, `element-snapshot.ts`, `element-types.ts`, `locators/`) because they're framework-agnostic; this package holds only the wrappers that take a `WebdriverIO.Browser` — which `core` can't type against. The arrow never reverses: `core` does not import `elements`, and the adapters' per-action capture (`captureActionSnapshot`) calls core's script bodies directly rather than going through this package. `elements/snapshot.ts` and `elements/locators/index.ts` are re-export shims kept for API stability.

The DOM-walking scripts run in the page via `browser.execute`, so — like `script` — they avoid Node-only APIs.

### `examples/`

Expand Down
Loading
Loading