mcpField
Q
qa-use

qa-use

github.com/desplega-aiTesting & quality29295 installsUpdated 22w ago
Repository

About qa-use

qa-use is a CLI and plugin skill for browser automation and end-to-end testing in AI-driven development workflows. It records browser interactions as reusable blocks and supports test execution, editing, and cloud synchronization.

Key features

  1. 01Create and manage browser sessions
  2. 02Navigate and interact with web pages
  3. 03Record interactions as reusable blocks
  4. 04Run, validate, and edit tests
  5. 05Sync tests with the cloud

Use cases

  1. 01Explore a web app and record user flows
  2. 02Run end-to-end tests during development
  3. 03Maintain and synchronize test definitions

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/desplega-ai/qa-use --skill qa-use

After installing, type/qa-usein Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
browser-commands.md
checks.md
ci.md
failure-debugging.md
localhost-testing.md
test-format.md
templates/
auth-flow.yaml
basic-test.yaml
form-test.yaml

Details

From the project README

qa-use

E2E testing and browser automation for AI-driven development workflows.

Critical Insight: Plugin Commands as Shortcuts

For AI Harnesses (codex, opencode, etc.):

Plugin commands (slash commands like /qa-use:verify) are convenience shortcuts that wrap CLI workflows. Harnesses with only the Bash tool can access ALL functionality via CLI commands documented below.

Pattern throughout this document:

  • CLI Workflow: Step-by-step CLI commands (works for ALL harnesses)
  • Plugin Shortcut: Optional slash command (convenience)

Setup & Configuration

Before using any qa-use commands, verify configuration is in place:

# Check current configuration (no-op if already configured)
qa-use setup

# Configure with API key (validates against server)
qa-use setup --api-key <key>

# View full configuration details
qa-use info

Environment Variables (alternative to config file):

VariableDescription
QA_USE_API_KEYAPI key for authentication
QA_USE_REGIONRegion: us (default) or auto
QA_USE_API_URLOverride API base URL

Config file: .qa-use.json in the project directory or ~/.qa-use.json in the home directory. Precedence: env vars > project .qa-use.json > ~/.qa-use.json.

If you encounter "API key not configured", 401, or auth errors: Run qa-use setup to check config state. NEVER fabricate or guess API keys.

Core Workflow

1. Browser Control & Session Lifecycle

CLI Workflow:

# Create browser session (returns immediately — runs detached in the background)
qa-use browser create --viewport desktop

# For localhost testing — auto-tunnels when base URL is localhost and API is remote.
# No flag needed for the common case:
qa-use browser create --no-headless http://localhost:3000

# Force a tunnel even in dev mode:
qa-use browser create --tunnel on --no-headless

# Opt out of auto-tunnel (e.g. backend is also local):
qa-use browser create --no-tunnel

# Navigate
qa-use browser goto https://example.com

# Snapshot to get element refs (ALWAYS do this before interacting)
qa-use browser snapshot

# Interact by ref
qa-use browser click e3
qa-use browser fill e5 "text"

# Close
qa-use browser close

Background session management:

qa-use browser create returns immediately — the actual browser + tunnel run in a detached child process so your terminal stays free. Manage sessions with:

qa-use browser status --list   # Show all active sessions across processes
qa-use browser status           # Details for the auto-resolved session
qa-use browser close <id>       # Close a specific session
qa-use doctor                   # Reap stale sessions/tunnels (dead PIDs)
qa-use doctor --dry-run         # Preview what would be cleaned

Tunnel commands:

Cross-process tunnel registry — multiple commands share a single tunnel per target:

qa-use tunnel start <url>         # Acquire a tunnel (released immediately unless --hold)
qa-use tunnel start <url> --hold  # Keep the tunnel up until Ctrl+C
qa-use tunnel ls                  # List active tunnels (target, public URL, refcount)
qa-use tunnel status <target>     # Detail for a single tunnel
qa-use tunnel close <target>      # Force-release a tunnel (kills detached holders)

Plugin Shortcut:

/qa-use:explore https://example.com

(Wraps create + goto + snapshot with autonomous exploration)

Critical: Always run snapshot before your first interaction on a page. Never guess element refs.

Snapshot Diff Feature (use it to avoid unnecessary snapshots): After each action (goto, click, fill, etc.), the browser automatically shows DOM changes:

  • Summary: "5 elements added, 1 element modified"
  • Added elements: + [e54] generic "Thanks for agreeing!" (green)
  • Modified elements: ~ [e18] checkbox "I agree..." with +attrs: checked, active (yellow)
  • Removed elements: - [e99] button "Submit" (red)

When you can skip a full snapshot: If the diff output from your last action already shows the element ref you need to interact with next, use it directly — no need for an intermediate snapshot. For example, if clicking a button shows + [e54] button "Submit" in the diff, you can click e54 immediately.

When you still need a full snapshot: Run snapshot when you need to find elements that weren't in the diff (e.g., pre-existing elements you haven't interacted with yet), or when the diff was truncated (shows "... and N more changes").

2. Understanding Blocks

What are blocks?

Blocks are atomic recorded interactions from a browser session. They are:

  • Automatically captured during any browser interaction (click, fill, goto, scroll, etc.)
  • Stored server-side with the session
  • Retrieved via qa-use browser get-blocks
  • The foundation for test generation

Why blocks matter:

  • Record-once, replay-many: Interactive recording becomes automated test
  • AI-friendly: Agents can analyze blocks to understand user intent
  • Version control: Blocks stored with session enable test iteration
  • Bridge CLI → Tests: Natural workflow from exploration to automation

How blocks work:

# 1. Create session and interact (auto-tunnels localhost)
qa-use browser create --no-headless
qa-use browser goto https://example.com
qa-use browser snapshot        # Returns: [ref=e1] button
qa-use browser click e1        # Records as block
qa-use browser fill e5 "text"  # Records as block

# 2. Retrieve blocks (JSON array)
qa-use browser get-blocks
# Returns:
# [
#   {"type": "goto", "url": "...", "timestamp": "..."},
#   {"type": "click", "ref": "e1", "timestamp": "..."},
#   {"type": "fill", "ref": "e5", "value": "text", "timestamp": "..."}
# ]

# 3. Generate test YAML from blocks
qa-use browser generate-test -n "my_test" -o qa-tests/my_test.yaml

# 4. Run generated test
qa-use test run my_test

Plugin Shortcut:

/qa-use:record start my_test
# ... perform interactions ...
/qa-use:record stop

(Wraps the interactive workflow with AI-powered test generation)

3. Test Management

CLI Workflow:

# Run test by name
qa-use test run login

# Run and save the (non-synced) local test to cloud
qa-use test run login --persist

# Validate syntax
qa-use test validate login

# Show test details
qa-use test info login

# List test runs
qa-use test runs --status failed

Plugin Shortcut:

/qa-use:test-run login

(Convenience shortcut for common test execution)

4. Test Variables (Imperative Edit)

Quick set/unset for the typed variables: block on a single test — useful when you don't want to round-trip the full YAML.

CLI Workflow:

# Local YAML file — Document API preserves comments + key order
qa-use test vars list  qa-tests/login.yaml
qa-use test vars list  qa-tests/login.yaml --json
qa-use test vars set   qa-tests/login.yaml --key user --value alice
qa-use test vars set   qa-tests/login.yaml --key url --value https://x \
                                          --type url --lifetime all
qa-use test vars set   qa-tests/login.yaml --key password --value hunter2 --sensitive
qa-use test vars set   qa-tests/login.yaml --key password --sensitive  # preserves stored value
qa-use test vars unset qa-tests/login.yaml --key user

# Remote --id fallback — exports YAML, mutates, re-imports (best-effort RMW)
qa-use test vars list  --id <uuid>
qa-use test vars set   --id <uuid> --key user --value alice
qa-use test vars unset --id <uuid> --key user

Rules:

  • Mutual exclusion: pass either <file> or --id, not both. Neither → exit 1.
  • --id requires a full UUID (use qa-use test list --query <name> to find one).
  • Form upgrade: passing only --key/--value writes simple form (key: value). Any of --type/--lifetime/--context/--sensitive upgrades to full form ({ value, type, lifetime, context, is_sensitive }).
  • Sensitive-preserve: on an existing sensitive var, --sensitive without --value keeps the stored value. On a new key, that combination errors out.
  • --json redaction: sensitive entries omit the value key entirely; the is_sensitive: true flag is the redaction signal.
  • Remote round-trip caveat: comment/key-order preservation only applies to the local-file path. The server normalizes formatting on import.

No Plugin Shortcut - Use CLI commands directly.

5. Test Sync Lifecycle

CLI Workflow:

# Pull tests from cloud
qa-use test sync pull

# Push all local tests to cloud
qa-use test sync push --all

# Push specific test
qa-use test sync push --id <uuid>

# Force push (overwrite conflicts)
qa-use test sync push --force

# Compare local vs cloud
qa-use test diff login.yaml

Persist vs Sync:

A local test is synced when its YAML has both an id: and a version_hash: (these are written back by test sync push/pull). --persist on test run and qa-use test sync are related but not the same:

Local file statepersistWhat happens at run time
Non-syncedfalse (default)Runs locally; nothing saved to cloud. Re-run with --persist or use test sync push to persist.
Non-syncedtrueTest is uploaded as a new cloud entry after the run. Re-running like this creates duplicates — prefer test sync push once the file tracks the cloud id.
SyncedfalseRuns against the cloud-tracked definition; no extra write.
SyncedtrueCloud definition is upserted (may overwrite newer cloud edits). Use test sync push/pull for explicit version control.

Rule of thumb: test sync push/pull is the deliberate path. Reserve --persist (or defaults.persist: true in .qa-use.json) for one-off uploads of brand-new local tests.

No Plugin Shortcut - Use CLI commands directly

Essential Commands

Browser Session Management
CommandDescription
qa-use browser createCreate remote browser session
qa-use browser create <url>Create session and navigate to URL
qa-use browser create --tunnel [auto|on|off]Tunnel mode — default auto (localhost + remote API). --no-tunnel is sugar for off.
qa-use browser create --no-headlessShow browser window (paired with a local/tunnel browser)
qa-use browser create --viewport <size>Set viewport: desktop, tablet, mobile
qa-use browser create --ws-url <url>Connect to existing WebSocket browser
qa-use browser create --after-test-id <uuid>Run a test first, then become interactive
qa-use browser create --var <key=value>Override app config variables (repeatable)
qa-use browser listList active sessions
qa-use browser statusShow current session details (app_url, recording_url, etc.)
qa-use browser status --listShow all active sessions across processes
qa-use browser closeClose active session
qa-use browser close <id>Close a specific session by id
qa-use doctorReap stale sessions/tunnels (dead PIDs)
qa-use tunnel lsList active tunnels in the registry
qa-use tunnel start <url> --holdHold a public tunnel for external consumers

Sessions auto-persist in ~/.qa-use.json. One active session = no -s flag needed. browser create returns immediately — the browser + tunnel run in a detached child. Use qa-use doctor if stale state accumulates.

Navigation
CommandDescription
qa-use browser goto <url>Navigate to URL
qa-use browser backGo back
qa-use browser forwardGo forward
qa-use browser reloadReload page
Element Interaction
CommandDescription
qa-use browser click <ref>Click element by ref
qa-use browser click --text "Button"Click by semantic description
qa-use browser fill <ref> "value"Fill input field
qa-use browser type <ref> "text"Type with delays (for autocomplete)
qa-use browser press <key>Press key (e.g., Enter, Tab)
qa-use browser check <ref>Check checkbox
qa-use browser uncheck <ref>Uncheck checkbox
qa-use browser select <ref> "option"Select dropdown option
qa-use browser hover <ref>Hover over element
qa-use browser scroll down 500Scroll by pixels
qa-use browser scroll-into-view <ref>Scroll element into view
qa-use browser drag <ref> --target <ref>Drag element to target
qa-use browser mfa-totp [ref] <secret>Generate TOTP code (optionally fill)
qa-use browser upload <ref> <file>...Upload file(s) to input (base64-encoded, works remote & tunnel)
Inspection & Snapshot Diff
CommandDescription
qa-use browser snapshotGet full ARIA tree with element refs (use only when diff output is insufficient)
qa-use browser urlGet current URL
qa-use browser screenshotSave screenshot.png
qa-use browser screenshot file.pngSave to custom path
qa-use browser screenshot --base64Output base64 to stdout
qa-use browser evaluate <expression>Execute JavaScript in browser context

The snapshot-diff feature automatically displays DOM changes after each browser action:

  • Added elements: Shown with + prefix and green color — these refs are immediately usable
  • Modified elements: Shown with ~ prefix and yellow color, including attribute changes (+attrs: checked)
  • Removed elements: Shown with - prefix and red color — do NOT use these refs

Downloads: When an action triggers a file download (e.g., clicking a download link), the response includes download info: filename, size, and a presigned URL. Use qa-use browser downloads to list all downloads or --save <dir> to save them locally.

Use diff output to interact with newly appeared elements directly, without running a full snapshot first.

Test Operations
CommandDescription
qa-use test run <name>Run test by name
qa-use test run --allRun all tests
qa-use test run <name> --tunnel [mode]Override tunnel mode (auto, on, off). --no-tunnel is sugar for off. Bare --tunnel is sugar for on.
qa-use test run <name> --downloadDownload assets to /tmp/qa-use/downloads/
qa-use test run <name> --var key=valueOverride variable
qa-use test validate <name>Validate test syntax
qa-use test listList available tests
qa-use test info <name>Show test details (steps, tags, description)
qa-use test info --id <uuid>Show cloud test details by ID
qa-use test runs [name]List test run history
qa-use test runs --id <uuid>Filter runs by test ID
qa-use test runs --status failedFilter runs by status
qa-use test initInitialize test directory
qa-use test sync pullPull tests from cloud
qa-use test sync push --allPush all local tests to cloud
qa-use test sync push --id <uuid>Push specific test
qa-use test sync push --forcePush tests, overwriting conflicts
qa-use test diff <file>Compare local vs cloud test
qa-use test schema [path]View test definition schema
API Operations (Dynamic OpenAPI)

qa-use api dynamically discovers operations from /api/v1/openapi.json and caches metadata locally for offline fallback.

CommandDescription
qa-use apiShow help and available subcommands
qa-use api lsList available /api/v1/* routes from OpenAPI
qa-use api ls --refreshForce refresh OpenAPI cache
qa-use api ls --offlineUse cached OpenAPI metadata only
qa-use api info /api/v1/<route>Show route details: parameters, request body, responses
qa-use api info /api/v1/<route> -X POSTShow info for specific HTTP method
qa-use api info /api/v1/<route> --jsonRoute info as JSON
qa-use api examplesShow usage examples
qa-use api openapiPrint OpenAPI spec URL
qa-use api openapi --rawDump full OpenAPI spec as JSON
qa-use api /api/v1/testsCall endpoint (method inferred when possible)
qa-use api -X GET /api/v1/test-runs -f limit=5GET with query fields
qa-use api -X POST /api/v1/tests-actions/run --input body.jsonPOST with JSON body file
qa-use api -X GET /api/v1/test-runs/<id>Fetch detail endpoint by ID

No Plugin Shortcut - Use CLI commands directly.

API Checks And Check Schedules

Remote API checks are managed through first-class commands. They call the desplega.ai API directly; they do not run checks locally or create browser sessions.

CommandDescription
qa-use check list --app-config <id>List remote API checks
qa-use check info <check-id>Inspect one check, including dependencies and captures
qa-use check create --name <name> --app-config <id> --config check.jsonCreate a check
qa-use check update <check-id> --depends-on <id> --alias <name>Update dependency-chain metadata
qa-use check delete <check-id> --forceDelete a check
qa-use check-schedule list --app-config <id>List remote check schedules
qa-use check-schedule create --name <name> --app-config <id> --cron "*/15 * * * *" --check <id>Create an ordered schedule
qa-use check-schedule run <schedule-id> --var env=stagingRun a schedule as a remote variable-passing chain

Common flow:

qa-use check create \
  --name "Auth token" \
  --app-config <app-config-id> \
  --config auth-check.json \
  --alias auth \
  --capture token=$.access_token

qa-use check update <claim-check-id> \
  --depends-on <auth-check-id> \
  --alias claim

qa-use check-schedule create \
  --name "Claims chain" \
  --app-config <app-config-id> \
  --cron "*/15 * * * *" \
  --check <auth-check-id> \
  --check <claim-check-id>

qa-use check-schedule run <schedule-id> --var env=staging --var claim_id=123

There is no standalone qa-use check run <check-id> command yet because the public API currently documents schedule runs, not individual check-run actions. Use qa-use api info /api/v1/checks -X POST for the current check payload contract, and see references/checks.md for examples.

No Plugin Shortcut - Use CLI commands directly.

Logs & Debugging
CommandDescription
qa-use browser logs consoleView console logs from session
qa-use browser logs console -s <id>View logs from specific/closed session
qa-use browser logs networkView network request logs
qa-use browser logs network -s <id>View network logs from specific session
qa-use browser downloadsList downloaded files from session
qa-use browser downloads --save <dir>Save downloaded files to local directory
qa-use browser downloads --jsonOutput download info as JSON
Test Generation
CommandDescription
qa-use browser generate-testGenerate test YAML from recorded session
qa-use browser generate-test -s <id>Generate from specific session
qa-use browser generate-test -n <name>Specify test name
qa-use browser generate-test -o <path>Specify output path
qa-use browser get-blocksGet recorded interaction blocks (JSON)
Waiting
CommandDescription
qa-use browser wait <ms>Fixed wait
qa-use browser wait-for-selector ".class"Wait for selector
qa-use browser wait-for-loadWait for page load
Variable Overrides

Use --var to override app config variables at runtime. Common variables:

VariableDescription
base_urlBase URL for the app (e.g., preview deployment URL)
login_urlLogin page URL
login_usernameUsername/email for authentication
login_passwordPassword for authentication

Example with ephemeral preview URL:

qa-use browser create --after-test-id <login-test-uuid> \
  --var base_url=https://preview-123.example.com \
  --var login_url=https://preview-123.example.com/auth/login

Common Patterns

Pattern 1: Feature Verification

CLI Workflow:

# 1. Search for existing test
qa-use test list | grep "login"

# 2. Run test
qa-use test run login

# 3. Debug failures
qa-use browser logs console

Plugin Shortcut:

/qa-use:verify "login works with valid credentials"

(Wraps the above CLI workflow with AI-powered test discovery and analysis)

Pattern 2: Record & Generate Test

CLI Workflow:

# 1. Create session (auto-tunnels localhost targets)
qa-use browser create --no-headless

# 2. Navigate and interact
qa-use browser goto https://example.com
qa-use browser snapshot
qa-use browser click e1
qa-use browser fill e5 "test"

# 3. Generate test from blocks
qa-use browser get-blocks
qa-use browser generate-test -n "my_test"

# 4. Run test
qa-use test run my_test

Plugin Shortcut:

/qa-use:record start my_test
# ... perform interactions ...
/qa-use:record stop
Pattern 3: Authenticated Exploration

CLI Workflow:

# Create session that runs login test first
qa-use browser create --after-test-id <login-test-uuid>

# Session now authenticated, explore
qa-use browser goto /dashboard
qa-use browser snapshot

Plugin Shortcut:

/qa-use:explore /dashboard

(Automatically handles auth detection and session creation)

Pattern 4: Edit Existing Test

CLI Workflow:

# 1. Open test file in editor
vim qa-tests/login.yaml

# 2. Validate syntax
qa-use test validate login

# 3. Run to verify
qa-use test run login

Plugin Shortcut:

/qa-use:record edit login

(AI-assisted editing with validation)

Pattern 5: Using Snapshot Diff to Avoid Unnecessary Snapshots

CLI Workflow:

# Create session and navigate
qa-use browser create --no-headless
qa-use browser goto https://evals.desplega.ai/checkboxes

# goto shows diff — initial page load shows all elements:
# Changes: 45 elements added
# + [e18] checkbox "I agree to the terms and conditions"
# + [e19] generic "I agree to the terms and conditions"

# ✅ Use ref from diff directly — no snapshot needed!
qa-use browser click e18

# Diff shows what changed:
# Changes: 5 elements added, 1 element modified
# + [e54] generic "Thanks for agreeing!"
# + [e55] link "Terms and Conditions"
# ~ [e18] checkbox "I agree to the terms and conditions"
#     +attrs: active, checked

# ✅ Can click e55 directly from diff output — no snapshot needed!
qa-use browser click e55

# ❌ Need to find an element NOT in the diff? Now run snapshot:
qa-use browser snapshot

Key principle: Use diff output as your primary source of element refs after actions. Only fall back to snapshot when you need to find elements that weren't in the diff.

Benefits:

  • Fewer API calls = faster automation
  • Diff refs are always fresh (just returned from the server)
  • Instantly see what changed (new elements, attribute changes, removals)

No Plugin Shortcut - Automatic feature in all browser commands

CI/CD Integration

Running Tests in CI

Environment Variables:

export QA_USE_API_KEY="your-api-key"
export QA_USE_REGION="us"  # Optional: "us" or "auto"

Basic Test Execution:

# Run all tests
qa-use test run --all

# Run specific tag
qa-use test run --tag smoke

# Exit codes: 0 = pass, 1 = fail
GitHub Actions Example
name: QA Tests
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '20'
      - name: Install qa-use
        run: npm install -g @desplega.ai/qa-use
      - name: Run tests
        run: qa-use test run --all
        env:
          QA_USE_API_KEY: ${{ secrets.QA_USE_API_KEY }}
Test Artifacts

Screenshots:

  • Automatically saved on failure
  • Location: /tmp/qa-use/downloads/ (local) or cloud (remote)

Logs:

  • Console logs: qa-use browser logs console -s <session-id>
  • Network logs: qa-use browser logs network -s <session-id>

Advanced Topics

Localhost Testing (Auto-Tunnel)

qa-use auto-tunnels localhost targets when the API is remote. No flag required for the common case:

qa-use browser create --no-headless http://localhost:3000
qa-use test run my_test   # auto-tunnels if base_url is localhost

Tri-state --tunnel flag:

ValueBehavior
auto (default)Tunnel iff base URL is localhost AND API URL is remote
on (or bare --tunnel)Force a tunnel even in dev mode
off (or --no-tunnel)Never tunnel
Testing localhost (http://localhost:3000)?
  ├─ API remote (default)  → auto-tunnels. No flag needed.
  ├─ API also local (dev)  → no tunnel by default. Use --tunnel on to force.
  └─ Public URL target     → no tunnel (remote cloud browser)

Plugin shortcuts handle tunnel detection automatically:

/qa-use:explore http://localhost:3000
/qa-use:record start local_test

See references/localhost-testing.md for troubleshooting.

Session Persistence

Sessions are stored in ~/.qa-use.json and have:

  • TTL: 30 minutes (default)
  • Auto-resolve: One active session = no -s flag needed
  • Cleanup: Automatic on timeout or explicit browser close
Block Limitations

What's captured:

  • goto, click, fill, type, check, uncheck, select, hover
  • scroll, scroll-into-view, drag, upload, press

What's NOT captured:

  • Assertions (must be added manually)
  • Waits (inferred from timing, may need adjustment)
  • Complex interactions (multi-drag, hover sequences)

Manual editing: Edit generated YAML to add assertions and refine selectors.

WebSocket Sessions

Sharing sessions across processes:

# Process 1: Create session (auto-tunnels if target is localhost + API remote)
qa-use browser create http://localhost:3000
# Output: ws://localhost:12345/browser/abc123

# Process 2: Connect to session
qa-use browser goto https://example.com --ws-url ws://localhost:12345/browser/abc123

Deep-Dive References

Access any reference at runtime via the CLI: qa-use docs <topic>

TopicCLI CommandDescription
browser-commands.mdqa-use docs browser-commandsComplete browser CLI reference with all flags
checks.mdqa-use docs checksAPI checks and check schedule workflows
test-format.mdqa-use docs test-formatFull test YAML specification
localhost-testing.mdqa-use docs localhost-testingTunnel setup for local development
failure-debugging.mdqa-use docs failure-debuggingFailure classification and diagnostics
ci.mdqa-use docs ciCI/CD integration patterns and examples

Use qa-use docs --list to discover all available topics and templates.

Templates

TemplateDescription
basic-test.yamlSimple navigation and assertion
auth-flow.yamlLogin flow with credentials
form-test.yamlForm submission with validation

Test Format Overview

name: Login Test
description: Validates login functionality with valid credentials
tags:
  - smoke
  - auth
app_config: <app-config-id>
variables:
  email: [email protected]
  password: secret123
depends_on: setup-test  # Optional
steps:
  - action: goto
    url: /login
  - action: fill
    target: email input
    value: $email
  - action: click
    target: login button
  - action: to_be_visible
    target: dashboard

See references/test-format.md for complete specification.

Common Mistakes

❌ Wrong✅ Correct
browser navigate <url>browser goto <url>
browser destroybrowser close
browser close <session-id>browser close
Guessing element refsUse refs from diff output or snapshot
Running snapshot after every actionUse diff output; only snapshot when needed
Forcing --tunnel in dev (both local)Rely on auto-mode, or use --tunnel on explicitly
test sync --pulltest sync pull (subcommand, not flag)
test sync --pushtest sync push (subcommand, not flag)

Troubleshooting

When stuck or encountering unexpected errors, use the built-in documentation:

# Check configuration state
qa-use setup

# Browse main documentation
qa-use docs

# List all available topics
qa-use docs --list

# Access specific topic
qa-use docs <topic>
SituationCommand
Auth / API key errorsqa-use setup then qa-use docs
Unknown browser commandqa-use docs browser-commands
Test failuresqa-use docs failure-debugging
Localhost / tunnel issuesqa-use docs localhost-testing
Test YAML syntaxqa-use docs test-format
API checks / schedulesqa-use docs checks
CI/CD setupqa-use docs ci

Key rules:

  • ALWAYS consult qa-use docs before improvising workarounds
  • NEVER fabricate API keys, tokens, URLs, or credentials
  • If qa-use setup shows no config, report it — don't guess

npx Alternative

All commands use qa-use assuming global install. For one-off use:

npx @desplega.ai/qa-use browser <command>

Comments

Markdown supported