Skip to main content
Back to Blog
AI Testing
2026-09-28

Vibium: Browser Automation for AI Agents and Testers

Vibium guide for QA teams using AI agents: WebDriver BiDi setup, CLI workflows, MCP, recordings, CI checks, failure modes, and Playwright MCP tradeoffs.

Vibium: Browser Automation for AI Agents and Testers

Vibium is an AI-oriented browser automation tool built on WebDriver BiDi. Its official docs describe it as browser automation for AI agents and humans, and the current installation page names vibium@26.8.21 as the latest npm release while the nightly docs explicitly compare nightly builds against that version. That means you need to read the docs with version awareness: several exciting AI commands, including vibium run, vibium ready, vibium setup, and the newer AI-verdict form of vibium check, are documented as nightly-only at the time I verified them.

For QA engineers, Vibium is interesting because it treats the browser as an evidence device for agents. Instead of only exposing a test framework API, it gives scripts and assistants a compact command surface: open a page, map elements, click a referenced element, read text, record evidence, and verify a claim. That overlaps with ideas in Browser Use AI Agent Testing Guide, but Vibium's foundation is WebDriver BiDi rather than a custom browser-control loop.

The short recommendation is this: evaluate Vibium when your team wants agents to inspect and verify real browser state without making Playwright the whole testing substrate. Keep Playwright, Selenium, Cypress, or WebdriverIO for established suites unless you have a clear migration reason. Vibium is best treated as a verification layer, agent tool, and lightweight automation surface, not as a drop-in replacement for every mature test runner feature.

Current Product Status And Version Reality

The official Vibium site and repository are active. The docs mention JS/TS, Python, and Java client libraries, a CLI, MCP integration, recordings, Chrome by default, Firefox support through native WebDriver BiDi, and machine-readable docs for agents. The installation page lists Node.js 18+ for the npm installer and JS client, supported platforms of Linux x64 or arm64, macOS x64 or arm64, and Windows x64, and a managed Google Chrome for Testing download on first browser use.

The part to be careful with is release channel language. The latest stable release is v26.8.21 (August 22, 2026), which is also the npm latest tag, and the GitHub Releases page is busy with prerelease nightly builds published almost daily. The nightly docs page is generated by diffing current nightly builds against vibium@26.8.21. For a test suite, pin the stable npm version and treat anything documented only on the nightly page as unavailable until a stable release ships it.

CapabilityVerified status in docsQA interpretation
CLI installnpm install -g vibium and npx -y vibium ... are documentedGood for local exploration and CI smoke checks
Latest npm baselineDocs compare nightly builds against vibium@26.8.21Pin and verify the actual installed package
WebDriver BiDiDocs state Vibium is built on WebDriver BiDiStandards-based control path, not CDP-only
Chrome for TestingManaged download on first browser useFewer driver-version chores
FirefoxSupported through native WebDriver BiDiUseful for standards validation, with documented differences
MCPDocs and repo describe MCP supportUseful for Claude Code, Cursor, and MCP-compatible agents
Run and Check AI commandsDocumented as nightly-only for nowDo not build stable CI on them without pinning nightly

Vibium is associated publicly with Jason Huggins, known for Selenium, through the GitHub release identity and project presence. The technical implication is more important than the biography: the project leans toward open browser standards and verification workflows rather than a browser-specific DevTools abstraction.

Install And Verify Without Assuming Nightly Features

Start with the stable CLI. The docs say a global npm install gives you the vibium binary, and the first command that needs a browser downloads a managed Chrome for Testing build. If you do not want a global install, the docs show npx -y vibium as a zero-install path.

npm install -g vibium
vibium go https://example.com
vibium text

For one-off trials:

npx -y vibium go https://example.com
npx -y vibium screenshot -o example.png
npx -y vibium text

For a project, install the client library in dev dependencies or normal dependencies depending on whether browser verification runs only in tests or also in developer tooling.

npm install --save-dev vibium
uv add --dev vibium

Do not begin a QA rollout by asking an agent to use vibium run unless you have installed a build that actually includes it. The Run and Check docs mark those AI features as nightly-only for now and say vibium check in 26.8.21 still toggles a checkbox. That is not a minor footnote. It changes what a command means.

Command or featureStable docs postureRollout advice
vibium goStable install verification pathSafe for smoke scripts
vibium textStable install verification pathGood for basic assertions
vibium add-skillDocumented for agent skillsUseful for Claude Code and Grok
vibium readyNightly-only in command docsUse only after selecting nightly
vibium runNightly-only in command docsKeep outside required CI initially
AI-verdict vibium checkNightly-only behaviorInspect version before scripting
vibium pipe --connect-capsMarked as nightly-onlyDo not rely on it in stable jobs

The first QA task is therefore a version probe. Use your package manager to print the installed version, then run one command that opens a page and one command that reads state. If either fails, fix browser installation before touching tests.

node -e "const pkg=require('vibium/package.json'); console.log(pkg.version)"
npx -y vibium go https://example.com
npx -y vibium text

That sample assumes the npm package exposes package.json through normal Node resolution. If your package manager blocks package internals, use npm ls vibium instead.

The WebDriver BiDi Foundation

Vibium's docs explain WebDriver BiDi as the standard behind the project. Classic WebDriver is request-response over HTTP. Chrome DevTools Protocol is bidirectional and powerful, but historically Chrome-centered. WebDriver BiDi combines bidirectional WebSocket communication with a standards process and browser vendor participation.

For QA engineers, that matters in three practical ways. First, browser events can flow back to the client without polling everything. Second, Firefox support does not require a separate driver binary in Vibium's documented path because Firefox speaks native BiDi. Third, the tool has a plausible standards story for future browser coverage instead of being tied to one vendor's private protocol.

Automation layerTransport and modelVibium relevance
Classic WebDriverHTTP request-responseStill important for Selenium Grid history
Chrome DevTools ProtocolWebSocket, Chrome-specific protocol familyPowerful, but not Vibium's stated foundation
WebDriver BiDiWebSocket, W3C standard directionVibium's core browser-control foundation
MCPJSON-RPC style tool interface for agentsLets agents invoke browser actions through tools
CLI daemon sessionsLocal process maintaining browser stateLets shell commands share a live browser

This is also where the Selenium comparison gets interesting. Selenium 4's BiDi work and Grid story are covered in Selenium 4.43 BiDi Grid Kubernetes Notes. Vibium is not Selenium Grid with a friendlier wrapper. It is a separate tool that uses BiDi to give agents and scripts a compact interface. If you already run Selenium Grid at scale, look at Vibium's pipe --connect path as an integration experiment, not a wholesale replacement.

CLI Workflow: Map, Act, Read, Record

The most agent-friendly Vibium workflow is not "write a giant test file first". It is map, act, read, and record. The docs describe a loop where the browser session exposes interactive elements, the script or agent chooses a reference, acts, and reads visible state back.

A basic manual sequence can look like this:

vibium go https://example.com
vibium text
vibium screenshot -o example.png

For pages with interaction, the docs show element references such as @e1 in the recording examples. A recorded session can capture the evidence around those actions.

vibium record start -o checkout.zip
vibium go https://staging.example.com/checkout
vibium find text "Continue"
vibium click @e1
vibium record stop

That pattern is useful during bug triage. An agent can drive the page, but the recording becomes reviewable evidence for humans. The docs say recordings include action traces, screenshots per step, optional HTML snapshots, and on Firefox a native video track when the engine supports it.

What people get wrong: they treat element references as durable selectors. @e1 is a reference in the current mapped session, not a design contract. It is perfect for the next action after a map. It is not a long-term selector to paste into a permanent suite. Permanent checks should express the intended text, label, role, or stable selector according to the client API or command available in your version.

JSON Output And Exit Codes For CI

Vibium's scripting docs are unusually important because they warn against a common automation mistake. Every command can accept --json and return an envelope with ok and result or error. The docs also say run and check can exit 0 when they deliver a verdict, even if the goal was not completed or the claim failed. In automation, you must inspect the result payload.

vibium --json url
vibium check "the cart shows one item" --json
vibium run "add a battery pack to the cart" --json

Use a small Node verifier around JSON output instead of relying on shell truthiness.

import assert from 'node:assert/strict';
import { spawnSync } from 'node:child_process';

const result = spawnSync('vibium', ['--json', 'url'], {
  encoding: 'utf8',
});

assert.equal(result.status, 0, result.stderr);
const envelope = JSON.parse(result.stdout);
assert.equal(envelope.ok, true);
assert.match(envelope.result.url, /^https?:\/\//);

That regex is anchored and the test checks process status, JSON parseability, envelope success, and result shape. This is the standard you want agents to follow. If an agent writes "run command and hope exit 0 means page is correct", ask it to inspect the contract.

A CI smoke job can install the package, open a page, capture text, and upload evidence. Keep this separate from experimental nightly AI actions.

name: vibium-smoke

on:
  pull_request:
  workflow_dispatch:

jobs:
  browser-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-node@v7
        with:
          node-version: 22
          cache: npm
      - run: npm ci
      - run: npx vibium go https://example.com
      - run: npx vibium text
      - run: npx vibium screenshot -o vibium-example.png
      - uses: actions/upload-artifact@v7
        if: always()
        with:
          name: vibium-smoke-${{ github.run_id }}
          path: vibium-example.png

If you run parallel jobs, do not let all of them share one local daemon session by accident. The sessions docs say one-shot CLI commands share a background daemon by default. Use VIBIUM_SESSION or --session to separate jobs.

export VIBIUM_SESSION=checkout-pr-123
vibium go https://staging.example.com/checkout
vibium text
vibium daemon stop

MCP For Claude Code, Cursor, And Other Agents

Vibium's repo and docs describe MCP support. Older update notes show a clicker mcp server with tools such as browser start, navigate, click, type, screenshot, find, and stop. Current docs describe Vibium skills, vibium add-skill, and MCP exposure for vibium_run and vibium_check in the AI feature path. The exact tool list can change across releases, so pin the package and read the generated command reference before standardizing prompts.

The stable operational idea is simple: MCP turns browser operations into tools an agent can call. That makes it different from asking the agent to emit code and then run the code. The agent can inspect the current browser, click, screenshot, and adjust.

vibium add-skill
vibium add-skill --agent claude
vibium add-skill --agent grok

For QA teams, agent enablement should include boundaries:

BoundaryWhy it mattersPractical rule
EnvironmentAgents may browse production by mistakeStart from staging URLs and explicit sessions
CredentialsBrowser state can leak screenshotsUse seeded test users, never personal accounts
EvidenceAgent claims need reviewSave screenshots or recordings for nontrivial changes
VersionStable and nightly commands differPin package and document available commands
CleanupDaemons keep browser state aliveStop sessions after CI and local reproductions

Compared with Playwright MCP, Vibium is less about giving an agent access to the Playwright testing ecosystem and more about giving it a compact browser verification tool. Playwright MCP is attractive when your suite, fixtures, and selectors are already Playwright-native. Vibium is attractive when the agent needs a small browser-control surface that can run from CLI, MCP, and client libraries without adopting Playwright Test as the organizing framework.

JS And Python Clients Without Over-Abstracting

The official repo shows a JS/TS client with browser.start(), bro.page(), page.go(), page.screenshot(), page.find(), and element click(). The installation docs say Python and Java clients exist and that each client bundles or locates the same Vibium binary. The using-Firefox docs also show JS and Python launchers for Firefox.

A JS smoke script based on the repo example can remain tiny:

import assert from 'node:assert/strict';
import fs from 'node:fs/promises';
import { browser } from 'vibium';

const bro = await browser.start();

try {
  const page = await bro.page();
  await page.go('https://example.com');
  const png = await page.screenshot();
  assert.ok(png.length > 1000);
  await fs.writeFile('example.png', png);

  const link = await page.find('a');
  assert.ok(link);
  await link.click();
} finally {
  await bro.stop();
}

For Firefox, the docs show a named launcher and an engine option:

import { firefox, browser } from 'vibium';

const firefoxBrowser = await firefox.start();
await firefoxBrowser.stop();

const explicit = await browser.start({ engine: 'firefox' });
await explicit.stop();

In Python, keep to verified launcher shape if you are documenting Firefox startup:

from vibium import firefox

bro = firefox.start()
try:
    pass
finally:
    bro.stop()

The discipline here is to avoid building a private framework too soon. Wrap only the parts your team repeats: session naming, base URL choice, evidence path, and cleanup. Let Vibium's client remain visible until the workflow stabilizes.

Firefox, Channels, And Browser Pinning

Vibium launches Chrome by default. The Firefox docs say Firefox is supported as an alternative engine using native WebDriver BiDi, no driver binary involved. On macOS and Linux, the binary auto-installs the selected engine on first launch. On Windows, Firefox auto-install is not available, so you install Firefox yourself and point VIBIUM_ENGINE_PATH at firefox.exe.

vibium install --engine firefox
vibium start --engine firefox
VIBIUM_ENGINE=firefox vibium go https://example.com

The docs also distinguish stable support from nightly channel controls. --channel beta and VIBIUM_ENGINE_CHANNEL=beta select Firefox beta. Nightly builds extend channels to Chrome with stable, beta, dev, and canary, and add VIBIUM_ENGINE_VERSION for exact version pinning.

Variable or flagDocumented effectQA use
--engine firefoxRun a command with FirefoxCross-engine smoke check
VIBIUM_ENGINE=firefoxDefault engine when flag omittedCI job-level browser selection
VIBIUM_ENGINE_PATHUse a specific Firefox executable on WindowsLocked-down Windows runners
VIBIUM_ENGINE_CHANNELSelect browser channelBeta validation
VIBIUM_ENGINE_VERSIONPin exact version in nightly buildsFleet reproducibility

Do not mistake "Firefox supported" for "all outputs identical". The docs call out feature differences, including native video recording requiring Firefox 154+ and PDF output differences. Cross-browser testing still needs assertions based on user-visible behavior, not pixel-perfect assumptions unless the point of the test is visual output.

A Real Failure Mode: Passing Command, Failed Claim

Here is the Vibium failure mode that will bite teams using AI agents: the command exits 0, the agent reports success, but the goal was not actually achieved. The docs warn that run exits 0 when the operation completed, whether the status is completed or not completed. check exits 0 when a verdict was delivered, even if the verdict is FAIL or INCONCLUSIVE.

The diagnosis is not "Vibium is flaky". The diagnosis is "your harness confused command execution with test success". Add JSON inspection and require the semantic status you expect.

import assert from 'node:assert/strict';
import { spawnSync } from 'node:child_process';

function runJson(args) {
  const proc = spawnSync('vibium', args, { encoding: 'utf8' });
  assert.equal(proc.status, 0, proc.stderr);
  const parsed = JSON.parse(proc.stdout);
  assert.equal(parsed.ok, true);
  return parsed.result;
}

const result = runJson([
  'run',
  'add a battery pack to the cart',
  '--base-url',
  'http://localhost:3000',
  '--json',
]);

assert.equal(result.status, 'completed');
assert.ok(Array.isArray(result.evidence));
assert.ok(result.evidence.length > 0);

That code is intentionally strict. It checks process status, parses JSON, validates the envelope, requires completed status, and demands evidence. The exact result shape can evolve, so update the assertion to your installed version's contract, but keep the principle: a delivered verdict is not the same as a passed test.

Where Vibium Fits Beside Existing Test Tools

Vibium is easiest to justify as an addition to a QA stack, not as a rushed replacement. Mature suites have fixtures, retries, reporters, page objects, accessibility helpers, test data setup, and CI sharding. Vibium's value is narrower and sharper: let humans and agents operate a browser, gather evidence, and verify state through a standards-based control layer.

Team situationVibium roleKeep using
Agents need browser access during code repairMCP or CLI verification toolExisting unit and e2e test suites
QA wants lightweight staging smoke checksCLI scripts with screenshots and text checksFull regression suite elsewhere
Selenium shop evaluating BiDiStandards experiment and agent layerSelenium Grid for broad compatibility
Playwright shop with strong fixturesOccasional external verifierPlaywright Test for core coverage
Product team needs reviewable repro evidenceRecordings and screenshotsBug tracker and normal triage process

The best first rollout is small. Pick one staging workflow, one seeded account, one session name, one screenshot artifact, and one clear assertion. Then invite an agent to help expand only after the first workflow is boringly reliable.

Frequently Asked Questions

Is Vibium stable enough for required CI gates?

Use the stable CLI pieces cautiously for smoke checks, especially go, text, screenshots, sessions, and recordings. Be more careful with AI features marked nightly-only, such as run, ready, setup, and the AI-verdict behavior of check. For required CI, pin the package, verify the installed version, inspect JSON output, and avoid relying on commands that your installed channel does not include.

How is Vibium different from Playwright MCP?

Playwright MCP gives agents access to a browser through the Playwright ecosystem, which is ideal when your tests, fixtures, and debugging habits already live in Playwright. Vibium focuses on a compact CLI, MCP, and client-library surface built on WebDriver BiDi. It is a good verifier for agents and QA scripts, but it does not replace the full Playwright Test platform for teams already invested there.

Does Vibium replace Selenium Grid?

No. Vibium can connect to remote BiDi or classic WebDriver endpoints through documented pipe --connect flows, and the docs mention classic WebDriver endpoint handling where Vibium creates a session and connects to the returned BiDi URL. That makes it interesting beside Selenium infrastructure. It does not automatically replace Grid scheduling, enterprise browser matrices, or the operational practices around large Selenium fleets.

What should QA teams check before adopting Vibium?

Check the installed version, release channel, browser install behavior, supported operating systems, session isolation, JSON result contracts, and evidence capture. Then run one workflow against staging with a seeded account and uploaded screenshots or recordings. The most important adoption question is not whether Vibium can click a button. It is whether your team can trust, review, and reproduce what an agent did in the browser.