Skip to content

Features

Every workflow runs through the blop CLI:

Command Behavior
blop test Discover specs, run them, write reports, exit non-zero on any failure.
blop run Same as test.
blop watch Run, then re-run on file change.
blop list Load specs and print discovered test names. No browser launched.
blop init Scaffold a starter spec.
blop skills Manage bundled SKILL.md files — list, view, check, improve.

See the CLI reference for every flag and option.

Three exports cover every spec file. Imported from "blop":

  • agentTest(name, handler) — register a test inside a describe block.
  • describe(name, fn) — create a named test scope. Nest as deep as you like.
  • defineAgentTest(test) — object-form test definition for generated specs.

Inside a test handler, the agent API is just two methods:

  • agent.goto(url) — queue a page navigation.
  • agent.goal(text) — describe a verification step in natural language.

No beforeEach/afterEach, no assertion functions in the DSL itself — assertions are delegated to the agent’s browser tools. See Writing tests.

The agent uses Chromium, Camoufox, Firefox, or WebKit through controlled native tools — no script execution, no shell escapes. Pick a browser with --browser or in config. Camoufox requires Node.js 22 or newer; local runs need a provisioned binary, while --containerized builds and reuses a separate warm Camoufox server container.

Terminal window
$ blop test --browser firefox --headed

Camoufox JS is experimental and must be installed explicitly. Blop pins the Playwright Core version used by the audited integration:

Terminal window
pnpm add -D camoufox-js@0.11.1 playwright-core@1.61.1
pnpm exec camoufox-js fetch
pnpm exec camoufox-js version
blop test --browser camoufox

Camoufox can run locally or in a separate warm container with --containerized. It does not provide Chromium CDP frame streaming, so Blop falls back to normal Playwright screenshots. The local upstream fetch command follows a mutable prerelease; reproducible CI should provision a verified binary directory and set CAMOUFOX_INSTALL_DIR. The final benchmark used 150.0.2-alpha.26.

Camoufox’s optional dependency tree includes differently licensed packages, including ua-parser-js@2.0.10 under AGPL-3.0-or-later. Review distribution and service-use obligations before enabling it outside local evaluation.

The agent has a curated set of Playwright-backed tools across navigation, page inspection, mouse, keyboard, forms, assertions, data extraction, diagnostics, batched execution, and lifecycle. You don’t call them directly — the agent picks the right tool for your goal — but knowing the catalog helps you write actionable goals. See Browser tools.

Every run writes a structured artifact bundle to .blop/:

File Format When
results.json JSON Always
events.jsonl JSONL Always
report.xml JUnit XML --reporter junit or all
screenshots/* PNG Captured during the run

Choose a reporter with --reporter: basic, json, junit, or all (default). See Reporters & output.

OpenAI, Anthropic, Google, Groq, xAI, OpenRouter, Mistral, Cerebras, NVIDIA via Khadim. Configure via CLI flags, env vars, or blop.config.ts. See Agent providers.

blop.config.ts (or .mts, .js, .mjs) with full TypeScript types. Every option is optional; the runner has sensible defaults. CLI flags always override config values. See Configuration.

Bundled SKILL.md files teach the agent domain-specific patterns. Manage them with blop skills list, view, check, and improve. See Skills.

Designed CI-first. JUnit XML, JSON results, and a JSONL event stream any pipeline can pick up. GitHub Actions metadata auto-captured. See CI integration.

For unit testing the runner or CI smoke checks of the framework itself, pass a mock agentStream to runBlopTests — no API keys required, no network calls. See Writing tests → Keyless testing.