| name | e2e-agent-browser |
| description | E2E test automation using agent-browser CLI. Performs stable browser tests with snapshot-based accessibility trees and the ref system. Triggers: "E2E", "browser testing", "agent-browser", "write e2e tests", "E2E testing", "browser automation" Anti-triggers: "unit tests", "API tests", "pytest", "Jest tests only", "use Playwright directly"
|
| user-invocable | false |
E2E Testing with agent-browser
Comprehensive guide for writing and running E2E tests using agent-browser, a headless browser automation CLI for AI agents.
When to Use This Skill
- Writing E2E tests for web applications
- Testing login/registration flows
- Testing form input and submission
- Testing navigation and routing
- Testing UI interactions (click, hover, scroll)
- Verifying visual state (element existence, text content)
- Running browser tests in CI/CD pipelines
Installation
npm install -g agent-browser
agent-browser setup
agent-browser setup --with-deps
Core Concepts
1. Snapshot + Ref Workflow
The core of agent-browser is the Accessibility Tree and ref system.
agent-browser open https://example.com
agent-browser snapshot -i
agent-browser click @e2
agent-browser fill @e3 "test@example.com"
agent-browser text @e1
2. Snapshot Options
agent-browser snapshot
agent-browser snapshot -i
agent-browser snapshot -c
agent-browser snapshot -d 3
agent-browser snapshot -s "#main"
agent-browser snapshot -i -c -d 5
3. JSON Mode (for AI agents)
agent-browser snapshot --json
E2E Test Patterns
Pattern 1: Basic Page Test
#!/bin/bash
set -e
agent-browser open https://myapp.com
TITLE=$(agent-browser title)
if [[ "$TITLE" != "My App" ]]; then
echo "FAIL: Expected title 'My App', got '$TITLE'"
exit 1
fi
agent-browser snapshot -i | grep -q "button.*Login" || {
echo "FAIL: Login button not found"
exit 1
}
echo "PASS: Homepage test"
agent-browser close
Pattern 2: Login Flow Test
#!/bin/bash
set -e
agent-browser open https://myapp.com/login
agent-browser snapshot -i
agent-browser fill @e1 "test@example.com"
agent-browser fill @e2 "password123"
agent-browser click @e3
agent-browser wait url "**/dashboard"
URL=$(agent-browser url)
if [[ "$URL" != *"dashboard"* ]]; then
echo "FAIL: Not redirected to dashboard"
exit 1
fi
echo "PASS: Login flow"
agent-browser close
Pattern 3: Form Input and Validation Test
#!/bin/bash
set -e
agent-browser open https://myapp.com/register
agent-browser snapshot -i
agent-browser click @submit-btn
agent-browser wait text "Email is required"
agent-browser snapshot -i | grep -q "Email is required" || {
echo "FAIL: Validation error not shown"
exit 1
}
agent-browser fill @email "valid@example.com"
agent-browser snapshot -i | grep -q "Email is required" && {
echo "FAIL: Email error should be gone"
exit 1
}
echo "PASS: Form validation"
agent-browser close
Pattern 4: Navigation Test
#!/bin/bash
set -e
agent-browser open https://myapp.com
agent-browser click role:link "About"
agent-browser wait url "**/about"
agent-browser back
agent-browser wait url "**/home"
agent-browser forward
agent-browser wait url "**/about"
echo "PASS: Navigation test"
agent-browser close
Pattern 5: Modal/Dialog Test
#!/bin/bash
set -e
agent-browser open https://myapp.com
agent-browser click @open-modal-btn
agent-browser wait @modal-dialog
agent-browser snapshot -s "[role=dialog]" -i
agent-browser click @close-modal-btn
VISIBLE=$(agent-browser isvisible @modal-dialog 2>/dev/null || echo "false")
if [[ "$VISIBLE" == "true" ]]; then
echo "FAIL: Modal should be closed"
exit 1
fi
echo "PASS: Modal test"
agent-browser close
Pattern 6: Drag and Drop Test
#!/bin/bash
set -e
agent-browser open https://myapp.com/kanban
agent-browser drag @task-1 @column-done
agent-browser snapshot -s "#column-done" | grep -q "Task 1" || {
echo "FAIL: Task not moved"
exit 1
}
echo "PASS: Drag and drop test"
agent-browser close
Pattern 7: File Upload Test
#!/bin/bash
set -e
agent-browser open https://myapp.com/upload
agent-browser upload @file-input "./test-file.pdf"
agent-browser wait text "Upload complete"
echo "PASS: File upload test"
agent-browser close
Advanced Features
Persistent Authentication Sessions
agent-browser open https://myapp.com --profile ~/.browser-profile/myapp
export AGENT_BROWSER_PROFILE=~/.browser-profile/myapp
agent-browser open https://myapp.com
Session Separation
AGENT_BROWSER_SESSION=test1 agent-browser open https://myapp.com &
AGENT_BROWSER_SESSION=test2 agent-browser open https://myapp.com &
wait
agent-browser sessions
Network Interception
agent-browser block "*.png"
agent-browser block "*analytics*"
agent-browser mock "/api/users" '{"users": [{"id": 1, "name": "Test"}]}'
agent-browser requests
Screenshots and PDF
agent-browser screenshot ./screenshot.png
agent-browser screenshot ./full.png --full
agent-browser pdf ./page.pdf
JavaScript Execution
agent-browser eval "document.title"
agent-browser eval "window.localStorage.getItem('token')"
agent-browser eval "
const items = document.querySelectorAll('.item');
return items.length;
"
Test Runner Script
Node.js Test Runner
const { execSync } = require('child_process');
const tests = [
'test_homepage.sh',
'test_login.sh',
'test_form_validation.sh',
'test_navigation.sh',
];
let passed = 0;
let failed = 0;
for (const test of tests) {
console.log(`Running ${test}...`);
try {
execSync(`bash e2e/${test}`, { stdio: 'inherit' });
passed++;
} catch (error) {
failed++;
console.error(`FAILED: ${test}`);
}
}
console.log(`\nResults: ${passed} passed, ${failed} failed`);
process.exit(failed > 0 ? 1 : 0);
npm Scripts
{
"scripts": {
"test:e2e": "node e2e/runner.js",
"test:e2e:headed": "AGENT_BROWSER_HEADED=1 npm run test:e2e"
}
}
CI/CD Integration
GitHub Actions
name: E2E Tests
on: [push, pull_request]
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Install agent-browser
run: |
npm install -g agent-browser
agent-browser setup --with-deps
- name: Start app
run: |
npm run build
npm run start &
sleep 5
- name: Run E2E tests
run: npm run test:e2e
- name: Upload screenshots on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: e2e-screenshots
path: e2e/screenshots/
Cloud Browser (Browserbase)
jobs:
e2e:
runs-on: ubuntu-latest
env:
AGENT_BROWSER_PROVIDER: browserbase
BROWSERBASE_API_KEY: ${{ secrets.BROWSERBASE_API_KEY }}
BROWSERBASE_PROJECT_ID: ${{ secrets.BROWSERBASE_PROJECT_ID }}
steps:
- uses: actions/checkout@v4
- run: npm run test:e2e
Debugging
Headed Mode
agent-browser open https://myapp.com --headed
Element Highlighting
agent-browser highlight @button
Console Log Inspection
agent-browser console
agent-browser console --error
Trace Recording
agent-browser trace start
agent-browser open https://myapp.com
agent-browser click @button
agent-browser trace stop ./trace.zip
Selector Guide
Ref-Based (Recommended)
agent-browser click @e1
agent-browser fill @e2 "text"
CSS Selectors
agent-browser click "#submit-btn"
agent-browser fill ".email-input" "test@example.com"
agent-browser click "div > button.primary"
Semantic Locators
agent-browser click role:button "Submit"
agent-browser fill role:textbox "Email" "test@example.com"
agent-browser click text:label "Remember me"
agent-browser click text: "Sign Up"
agent-browser click testid:submit-form
Wait Strategies
agent-browser wait @element
agent-browser wait text "Success"
agent-browser wait url "**/dashboard"
agent-browser wait 2000
agent-browser wait load
agent-browser wait domcontentloaded
agent-browser wait networkidle
agent-browser wait js "window.appReady === true"
Best Practices
1. Snapshot-First Approach
agent-browser snapshot -i
agent-browser click @e1
2. Stable Waits
agent-browser wait @loading-spinner
agent-browser wait text "Data loaded"
3. Error Handling
#!/bin/bash
cleanup() {
agent-browser close 2>/dev/null || true
}
trap cleanup EXIT
set -e
4. Environment-Specific Configuration
AGENT_BROWSER_PROFILE=~/.browser-test
AGENT_BROWSER_HEADED=0
BASE_URL=http://localhost:3000
5. Test Isolation
agent-browser cookies clear
agent-browser local clear
agent-browser session clear
Useful Command Summary
| Command | Description |
|---|
agent-browser open <url> | Open page |
agent-browser snapshot -i | Interactive element snapshot |
agent-browser click @ref | Click |
agent-browser fill @ref "text" | Enter text |
agent-browser text @ref | Get text |
agent-browser wait text "msg" | Wait for text |
agent-browser wait url "**/path" | Wait for URL |
agent-browser screenshot ./ss.png | Screenshot |
agent-browser isvisible @ref | Check visibility |
agent-browser close | Close browser |
Resources