Learn Vibium in a Weekend
Learn Vibium in a weekend: a 2-day plan to install it, write real browser scripts, add semantic locators, wire up the MCP server, and ship a project.
You can learn Vibium in a weekend by following a two-day plan: install it and run your first script on Saturday morning, master locators and auto-waiting by Saturday night, then wire up the MCP server and ship a real project on Sunday. Vibium is AI-native browser automation built on WebDriver BiDi, shipped as a single Go binary that auto-downloads Chrome. Because a complete script is just launch, go, find, act, and close, the learning curve is short and the payoff is immediate. This guide gives you a concrete hour-by-hour schedule with runnable JavaScript and Python code, the exact commands to type, and the internal guides to open at each step. By Sunday night you will have written scrapers, form-fillers, and screenshot scripts, and connected an AI agent to a live browser. Vibium was created by Jason Huggins, co-creator of Selenium and Appium; this site is an independent hub that simply teaches it.
What does the Vibium weekend plan actually cover?
The weekend plan is a four-stage path from zero to a shipped project, with each stage building on the last. You do not need to finish everything to be useful; each stage leaves you with a working skill you can stop at.
The idea is to spend Saturday on the deterministic core (the part every Vibium user needs) and Sunday on the AI-native layer and a real deliverable. Here is the map:
| Stage | When | What you learn | Outcome |
|---|---|---|---|
| 1. Setup & first script | Sat morning | Install, launch Chrome, go, screenshot, click | A running 10-line script |
| 2. Locators & waiting | Sat afternoon | CSS + semantic find(), auto-waiting, typing, reading | Robust, non-flaky scripts |
| 3. AI + MCP | Sun morning | check(), do(), connect the MCP server to Claude Code | An AI agent that browses |
| 4. Ship a project | Sun afternoon | Combine skills into a scraper or a UI test | A tool you can reuse |
If you only have one day, do Stage 1 and Stage 2 — that is the 80% that makes Vibium worth learning. Save Stages 3 and 4 for later.
Saturday morning: how do I install Vibium and run my first script?
Start by installing Vibium into a fresh project, because it downloads its own Chrome for Testing and needs no separate browser or driver. Give yourself about 45 minutes for this stage, including the download.
Vibium has two supported clients with almost identical APIs. Pick one language for the whole weekend so your skills compound. If you are unsure which, the what is Vibium overview explains the tradeoffs.
For JavaScript, create a project and install the package:
mkdir vibium-weekend && cd vibium-weekend
npm init -y
npm install vibiumFor Python, use a virtual environment so the install stays isolated:
mkdir vibium-weekend && cd vibium-weekend
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install vibiumIf either command fails, the install Vibium guide covers Node and Python setup, PATH issues, and Linux Chrome dependencies in detail.
What should my very first script do?
Your first script should launch a real Chrome window, load a page, save a screenshot, and click a link, so you see every core method fire once. This is the "hello world" of browser automation.
Create hello.js and paste this. It uses the synchronous API, which reads top to bottom with no await:
const fs = require("fs");
const { browser } = require("vibium/sync");
// Launch Chrome and grab the default tab
const bro = browser.launch();
const page = bro.page();
// Navigate to a page
page.go("https://example.com");
console.log("Loaded:", page.title());
// Save a screenshot (screenshot() returns PNG bytes)
fs.writeFileSync("example.png", page.screenshot());
console.log("Saved example.png");
// Find a link, read it, then click it
const link = page.find("a");
console.log("Link text:", link.text());
link.click();
bro.close();Run it with node hello.js. Chrome opens, loads the page, and closes; a new example.png appears in your folder.
The Python version is the same shape:
from vibium import browser
# Launch Chrome and grab the default tab
bro = browser.launch()
page = bro.page()
# Navigate to a page
page.go("https://example.com")
print("Loaded:", page.title())
# Save a screenshot (screenshot() returns PNG bytes)
with open("example.png", "wb") as f:
f.write(page.screenshot())
print("Saved example.png")
# Find a link, read it, then click it
link = page.find("a")
print("Link text:", link.text())
link.click()
bro.close()Run it with python3 hello.py. If you want a slower, more explained walkthrough of these lines, read your first Vibium script.
What does each first-script method do?
Each call maps to exactly one browser action, which is why Vibium scripts stay readable even as they grow.
| Method | What it does |
|---|---|
browser.launch() | Starts Chrome, returns a browser object |
bro.page() | Returns the default page (tab) |
page.go(url) | Navigates and waits for the load event |
page.title() | Returns the document title |
page.find(selector) | Locates an element, auto-waiting for it |
el.text() | Returns the element's text content |
el.click() | Clicks after actionability checks pass |
page.screenshot() | Captures the page as PNG bytes |
bro.close() | Closes the browser |
By the end of Saturday morning you have installed Vibium and run a real script. That is genuinely the hardest part behind you.
Saturday afternoon: how do I find elements and avoid flaky waits?
Spend the afternoon on locators and auto-waiting, because those two topics separate scripts that break constantly from scripts you can trust. This is the most valuable hour of the weekend.
Vibium has one find() method with two signatures. Pass a string for a CSS selector, or an object for semantic strategies like role, text, and label. Semantic locators survive markup refactors far better than deep CSS paths.
const { browser } = require("vibium/sync");
const bro = browser.launch();
const page = bro.page();
page.go("https://duckduckgo.com");
// CSS selector — a plain string
page.find("input[name='q']").type("vibium browser automation");
// Semantic locators — an object (role, text, label, placeholder...)
page.find({ role: "button", text: "Search" }).click();
console.log(page.title());
bro.close();In Python the semantic form uses keyword arguments, which reads even more cleanly:
from vibium import browser
bro = browser.launch()
page = bro.page()
page.go("https://duckduckgo.com")
page.find("input[name='q']").type("vibium browser automation")
page.find(role="button", text="Search").click()
print(page.title())
bro.close()The combinable form — find({ role: "button", text: "Search" }) — is a Vibium signature feature. It matches on role and text in a single call, where older tools force you to chain filters. For a deeper tour of selectors and the returned element, see find element.
Why don't I need to write waits?
You do not write waits because Vibium enforces actionability inside its Go engine before every interaction. It polls until the target element is visible, stable, enabled, and able to receive the event, up to a 30-second default timeout.
That single design choice removes the setTimeout and stale-element retry code that makes older automation frustrating for beginners. When you call click(), Vibium has already confirmed the element is ready. This is how Vibium works under the hood, and it is the main reason the tool is beginner-friendly.
What should I practice on Saturday afternoon?
Practice by reading, typing, and clicking on a real site so the core loop becomes muscle memory. Try these three micro-exercises before you stop for the day:
- Read data. Open a page,
find()a heading, and print itstext(). - Fill a form. Locate an input with a semantic locator and
type()into it. Follow the full pattern in automate a login with Vibium. - Capture proof. Save a
screenshot()after an action so you can verify results. See screenshot for full-page and element captures.
Do these in both the sync style shown here and, optionally, the async style. The sync vs async guide explains when each is the right choice — the short version is sync for linear scripts, async when you are already inside async code.
What beginner mistakes should I avoid this weekend?
Most first-weekend problems come from a handful of predictable mistakes, so knowing them in advance saves you an hour of confusion. Watch for these four.
- Adding manual sleeps. Because Vibium already auto-waits, sprinkling
page.wait(3000)calls slows your scripts down for no benefit and hides real timing issues. Only reach for an explicit wait when you are waiting on something that is not an element, like a network response. - Over-specific CSS selectors. A selector like
div.container > div:nth-child(3) > a.linkbreaks the moment the markup shifts. Prefer a semantic locator such asfind({ role: "link", text: "Next" }), which describes intent instead of structure. - Forgetting to close the browser. If a script throws before
bro.close(), Chrome can linger. Wrap risky code intry/finally(JavaScript) or atry/finallyblock (Python) so the browser always shuts down. - Confusing sync and async imports.
require("vibium/sync")gives you the no-awaitAPI used all weekend; the barerequire("vibium")is the async API and needsawaiton every call. Mixing them is the single most common beginner error.
Keeping these in mind turns Saturday's scripts from "works once" into "works every time," which is the whole point of the afternoon.
Sunday morning: how do I use the AI and MCP features?
On Sunday morning, add the AI-native layer that makes Vibium different from Selenium or Playwright. These features sit on top of the deterministic API you already learned, so nothing you did on Saturday is wasted.
Vibium ships two AI methods. page.check() verifies a plain-English claim about the page, and page.do() performs a plain-English action by planning real find/click/type calls under the hood.
const { browser } = require("vibium/sync");
const bro = browser.launch();
const page = bro.page();
page.go("https://example.com");
// Plain-English verification — returns a structured result
const result = page.check("the page has a heading and a link");
console.log(result.passed, result.reason);
bro.close();The key mental model: check() and do() are AI planning, not AI puppeteering. They call Vibium's own deterministic commands, so their actions are the same ones you would write by hand. Treat them as a convenience for when you want to describe intent rather than name a selector.
How do I connect Vibium to an AI agent?
Connect Vibium to an AI coding agent by registering its built-in MCP server, which exposes browser commands as tools the agent can call. This turns "browse the web" into something Claude Code or Cursor can do directly.
For Claude Code, add the server with a single command:
claude mcp add vibium -- npx -y vibium mcpNow an AI agent can launch a browser, navigate, and read pages on your behalf through natural-language requests. The full setup, including verification and troubleshooting, is in set up Vibium MCP in Claude Code.
This is a good moment to appreciate what you have assembled: the same Go binary that runs your scripts also serves the MCP endpoint, so there is nothing extra to install. Spend the rest of the morning asking your agent to perform small browsing tasks and watching which Vibium commands it invokes.
Sunday afternoon: what project should I ship?
Finish the weekend by combining your skills into one small, real project, because shipping something cements the learning far better than more tutorials. Pick the project that matches why you started.
Here is a decision table to choose fast:
| If your goal is... | Build this | Key skills used |
|---|---|---|
| Web scraping / data | A table or link extractor | find, findAll, text, attr |
| QA / testing | A login smoke test with an assertion | find, type, click, check |
| AI / agents | An MCP-driven browsing task | MCP server, do, check |
| Automation / RPA | A repetitive form-fill script | find, type, click, screenshot |
How do I build a small scraper as my project?
Build a scraper by looping over the results of findAll() and reading each element, which is the foundation of nearly every data-extraction task. This example collects every link on a page:
const { browser } = require("vibium/sync");
const bro = browser.launch({ headless: true });
const page = bro.page();
page.go("https://example.com");
// findAll returns an array immediately
const links = page.findAll("a");
for (const link of links) {
console.log(link.text(), "->", link.attr("href"));
}
console.log(`Found ${links.length} links`);
bro.close();The Python equivalent uses the same methods:
from vibium import browser
bro = browser.launch(headless=True)
page = bro.page()
page.go("https://example.com")
links = page.find_all("a")
for link in links:
print(link.text(), "->", link.attr("href"))
print(f"Found {len(links)} links")
bro.close()Notice headless: True (or headless=True in Python) — that runs Chrome without a visible window, which is what you want for a real scraping or CI job. To extend this into a full data pipeline, follow the patterns in the how-to guides section of this site.
Headed versus headless is worth understanding before you ship. Run headed (the default, a visible window) while you develop, so you can watch the browser and spot when a locator misses. Switch to headless once the script works, because it starts faster, uses less memory, and runs on servers with no display. The behavior is identical either way — the only difference is whether a window is drawn — so a script debugged headed will behave the same headless. When something misbehaves in headless mode, flip it back to headed for one run and watch what the browser actually does.
How do I build a UI test as my project?
Build a UI test by wrapping the launch/act/assert flow in your test runner and quitting the browser in teardown. This Jest-style test verifies a page loads a heading:
const assert = require("node:assert");
const { browser } = require("vibium/sync");
test("example page has a heading", () => {
const bro = browser.launch({ headless: true });
const page = bro.page();
try {
page.go("https://example.com");
const heading = page.find("h1");
assert.ok(heading.text().length > 0, "heading should not be empty");
} finally {
bro.close();
}
});Always close the browser in a finally block or a teardown hook so a failed assertion never leaves a stray Chrome process behind. To scale this into a maintainable suite, adopt the page object model, which keeps your locators in one place as your tests grow.
What does a realistic weekend schedule look like?
A realistic schedule keeps each session to about two hours with breaks, because browser automation is best learned in short, hands-on bursts rather than one long marathon. Use this as your checklist.
| Slot | Focus | Deliverable |
|---|---|---|
| Sat AM | Install + first script | hello.js runs, screenshot saved |
| Sat PM | Locators + auto-waiting | Read, fill, and capture exercises done |
| Sun AM | AI methods + MCP server | Agent browses a page for you |
| Sun PM | Ship a project | A scraper or UI test you can rerun |
If you fall behind, drop Sunday morning first — the MCP and AI layer is powerful but optional. The Saturday material is the true foundation, and finishing it alone makes the weekend a success.
How do I keep learning after the weekend?
Keep learning by picking one direction — testing, scraping, or AI agents — and going deep with the topic-specific guides on this site, rather than trying to learn everything at once. You now have the vocabulary to follow any of them.
Two habits accelerate the next phase. First, always prefer semantic locators over brittle CSS so your scripts survive site changes. Second, keep the glossary open for unfamiliar terms like actionability, BiDi, and MCP; a shared vocabulary makes every other article faster to read.
Vibium itself is Jason Huggins' open-source project at vibium.com and on GitHub. This site is an independent learning hub — we just teach the tool. If you want a longer, structured path beyond the weekend, the guided course sequences these topics into a full curriculum.
Next steps
- Install Vibium — the definitive setup guide for Node and Python.
- Your first Vibium script — a slower, line-by-line walkthrough.
- Find element — the full locator reference, CSS and semantic.
- Automate a login with Vibium — your first real end-to-end flow.
- Set up Vibium MCP in Claude Code — connect an AI agent to a live browser.
- Page object model — structure tests before they grow.
- The course — a guided path that goes beyond a single weekend.
Frequently asked questions
Can I really learn Vibium in a weekend?
Yes, for the core workflow. In two focused days you can install Vibium, write scripts that launch Chrome and click elements, learn semantic locators and auto-waiting, connect the MCP server to an AI agent, and ship a small scraping or testing project. Mastering advanced tracing and CI takes longer, but you will be productive by Sunday night.
What do I need before starting the Vibium weekend plan?
You need a laptop with either Node.js 18+ or Python 3.9+, a code editor like VS Code, and about six to eight hours of focused time across two days. Vibium downloads its own Chrome for Testing, so you do not need to install a browser or a separate driver. No prior automation experience is required.
Should I learn Vibium with JavaScript or Python?
Pick the language you already know or want to work in. Vibium ships first-class JavaScript/TypeScript and Python clients with nearly identical APIs, so skills transfer directly. JavaScript suits web developers and Node projects; Python suits QA engineers, data scraping, and AI workflows. This weekend plan shows both side by side.
Is Vibium hard to learn for beginners?
No. Vibium was designed to be readable: a full script is launch, go, find, act, and close in about ten lines. Auto-waiting removes the flaky sleep-and-retry code that makes older tools confusing. If you can read a for-loop, you can write a Vibium script by the end of your first afternoon.
What can I build after learning Vibium in a weekend?
After a weekend you can build web scrapers that extract tables or links, automated logins and form fills, screenshot and visual-check scripts, simple UI tests with pytest or Jest, and AI agents that browse the web through the built-in MCP server. These are real, shippable tools, not just toy demos.
Who created Vibium and is it free to learn?
Vibium was created by Jason Huggins, co-creator of Selenium and Appium. It is free and open source at vibium.com and github.com/VibiumDev/vibium, installed with pip install vibium or npm install vibium. This site, learnvibium.com, is an independent learning hub and is not affiliated with the Vibium project.
Vibium is created by Jason Huggins. This is an independent tutorial — see the official Vibium site and GitHub repo for canonical docs.
Related guides
Is Vibium Worth Learning in 2026?
Is Vibium worth learning in 2026? An honest breakdown of who it fits, what it costs to learn, and when to pick it over Playwright or Selenium.
14 min read→Getting StartedVibium Cheat Sheet (2026)
The complete Vibium cheat sheet for 2026: install, launch, find, click, type, wait, screenshot, and MCP commands with copy-paste JavaScript and Python.
13 min read→Getting StartedUnderstanding Vibium's Installed Folder Structure
What npm install vibium actually puts on disk — the package, the bundled Go binary, the auto-downloaded Chrome, and where Vibium caches everything.
1 min read→Getting StartedVibium for AI Engineers and Agent Builders
Vibium for AI engineers and agent builders: a hands-on guide to driving a browser from LLM agents via MCP, semantic finds, and the accessibility tree.
15 min read→