Closes GAP-03a, GAP-03b, GAP-06, GAP-07, and revises GAP-09. - Rephrased Playwright references in enterprise-integration-testing and pentest-validation to point at qe-browser (batch/assert/check-injection) so the AQE fleet's canonical browser runner is the recommended tool. - accessibility-testing: added qe-browser / a11y-ally as the preferred axe-core integration path ahead of the Playwright example; Playwright kept as a documented fallback for Firefox/Safari or existing suites. - GAP-09 revised: visual-testing-advanced and compatibility-testing are intentional hybrids, not unfinished migrations. visual-testing-advanced already labels its Playwright section "LEGACY: fallback"; compatibility -testing notes that Vibium's BiDi backend is Chrome-only at v26.3.x so Firefox/Safari coverage still needs Playwright. Both stay as-is. - Added docs/guides/qe-browser-getting-started.md covering install, smoke check, eval run, and the 5 primitives with example CLI calls. - Added .github/workflows/test-qe-browser.yml gating PRs that touch the skill, its installer, or CommandEvalRunner. Job 1 runs the full vitest sweep; Job 2 installs a pinned Vibium and runs smoke-test.sh against real httpbin fixtures. - Workflow validated with actionlint 1.7.1 (clean). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.9 KiB
qe-browser: Getting Started
qe-browser is the AQE fleet's shared browser-automation skill. It wraps
Vibium (a ~10 MB Go binary built on
the W3C WebDriver BiDi standard) and adds five QE-specific primitives:
typed assertions, batch execution, visual diff, prompt-injection scanning,
and semantic intent scoring.
This guide covers first-time install, a smoke check, and the CLI handles you'll use most often.
Install
aqe init installs Vibium globally via npm install -g, pinned to the
version verified against the skill's primitives (see
DEFAULT_VIBIUM_SPEC in src/init/browser-engine-installer.ts).
aqe init # installs Vibium if missing (or run --minimal to skip)
vibium --version # should print a 26.3.x version string
If you're on Linux ARM64 and vibium go can't launch Chrome, Vibium
doesn't yet auto-download Chrome for Testing on that architecture. Use your
distro's Chromium and set VIBIUM_BROWSER_PATH — see the "Linux ARM64"
section of .claude/skills/qe-browser/SKILL.md for the exact symlink
commands.
Smoke check
The skill ships with a shell-based smoke test that exercises every primitive against pinned public fixtures (httpbin.org) and a tiny local static server. Run it after install to confirm the whole stack works end-to-end:
bash .claude/skills/qe-browser/scripts/smoke-test.sh
Expected: 9/9 steps pass. Each step prints its command and exit code; any failure points at which primitive is misbehaving.
Running the eval suite
From v3.10 onwards, qe-browser ships a runnable eval suite that evaluates
shell-command exit codes and JSON envelopes against the script output. To
execute it via the shared aqe eval CLI:
aqe eval run --skill qe-browser --model claude-3.5-sonnet
The runner detects that qe-browser.yaml is command-mode (its test cases
have input.command fields) and dispatches to CommandEvalRunner
instead of the LLM-prompt runner used by most other skills. No model
tokens are spent; the --model flag is retained only for report
compatibility.
Supported assertion kinds in the suite:
| Field | What it checks |
|---|---|
exit_code |
Strict equality vs the process exit code |
json_fields |
Dotted JSONPath -> expected value (deep equality) |
severity_at_least |
none < low < medium < high < critical |
candidate_count_at_least |
Numeric lower bound on intent-score candidates |
Setup steps in input.setup[] (e.g. vibium go <url>) run sequentially
before each test case's main command. Any non-zero setup exit
short-circuits the case as failed.
The five primitives at a glance
Each primitive is a standalone Node script in
.claude/skills/qe-browser/scripts/ and produces a structured JSON
envelope on stdout. Combine them directly in shell, CI, or from a QE
agent's batch plan.
# typed assertions
node .claude/skills/qe-browser/scripts/assert.js --checks \
'[{"kind":"url_contains","text":"/forms"},{"kind":"selector_visible","selector":"h1"}]'
# multi-step flow with stop-on-failure
node .claude/skills/qe-browser/scripts/batch.js --steps \
'[{"action":"go","url":"https://httpbin.org/html"},{"action":"wait_load"},{"action":"assert","checks":[{"kind":"selector_visible","selector":"h1"}]}]'
# visual diff vs saved baseline (creates one on first run)
node .claude/skills/qe-browser/scripts/visual-diff.js --name home --threshold 0.02
# prompt-injection scan against the currently-loaded page
node .claude/skills/qe-browser/scripts/check-injection.js --include-hidden
# semantic intent score — "what element would satisfy this intent?"
node .claude/skills/qe-browser/scripts/intent-score.js --intent submit_form
All scripts exit 0 on a passing assertion, 1 on a failure, 2 on an
unavailable backend (e.g. Vibium not installed). The JSON envelope
schema lives at .claude/skills/qe-browser/schemas/output.json.
Which QE skills use qe-browser?
a11y-ally— WCAG audits with axe-core + pa11y + Lighthousee2e-flow-verifier— end-to-end user flows with step-by-step assertionsqe-visual-accessibility— viewport-sweep visual regressionsecurity-visual-testing— URL allow-list + PII + visual regressionpentest-validation— browser-side exploit validation (e.g. reflected XSS)testability-scoring— intrinsic-testability probeobservability-testing-patterns— dashboard/APM UI validationlocalization-testing,compatibility-testing,accessibility-testing,visual-testing-advanced— reference qe-browser as the preferred Chrome-side runner; Playwright remains a documented fallback where Vibium's Chrome-only BiDi backend is a constraint (Firefox/Safari).
Related
- ADR-091 (decision record):
docs/implementation/adrs/ADR-091-qe-browser-skill-vibium-engine.md - Skill definition:
.claude/skills/qe-browser/SKILL.md - Migration guide (Playwright -> qe-browser):
.claude/skills/qe-browser/references/migration-from-playwright.md