| name | browser-access |
| description | Headless browser automation for web research and intelligence gathering. Enables the Explorer agent to access websites, extract content, capture screenshots, and interact with web forms. |
Browser Access Skill
Purpose: Enable headless browser automation for web research and intelligence gathering, allowing the Explorer agent to access websites, extract content, capture screenshots, and interact with web forms.
Status: 🟡 In Development
Location: skills/browser-access/
Implementation: browser-controller.js, scraper.js
Features
- Headless Browser Automation: Puppeteer-based Chrome/Chromium control
- Web Scraping: Content extraction with CSS selectors and XPath
- Screenshot Capture: Full page and element-level screenshots
- Form Interaction: Fill forms, click buttons, navigate pages
- Security Sandboxing: Isolated browser context with restricted permissions
- Rate Limiting: Configurable request throttling to avoid detection
- Session Management: Persistent and ephemeral browsing sessions
- PDF Export: Save pages as PDF documents
- Navigation Control: Wait for selectors, network idle, custom conditions
Commands
| Command | Description | Example |
|---|
navigate | Navigate to URL | node browser-controller.js --navigate https://example.com |
scrape | Extract content from URL | node browser-controller.js --scrape https://example.com |
screenshot | Capture screenshot | node browser-controller.js --screenshot https://example.com |
pdf | Export page as PDF | node browser-controller.js --pdf https://example.com |
interact | Perform interactions | node browser-controller.js --interact (JSON config) |
session | Manage browsing sessions | node browser-controller.js --session list |
API Methods
Browser Controller
const browser = new BrowserController({
headless: true,
sandbox: true,
rateLimit: 1000,
timeout: 30000
});
await browser.navigate('https://example.com');
const content = await browser.getContent();
await browser.screenshot({ path: './screenshots/example.png', fullPage: true });
await browser.pdf({ path: './exports/example.pdf' });
await browser.close();
Web Scraper
const scraper = new WebScraper(browser);
const title = await scraper.extractText('h1');
const mainContent = await scraper.extractHTML('.main-content');
const links = await scraper.extractLinks('a');
const items = await scraper.extractByXPath('//div[@class="item"]');
const data = await scraper.evaluate(() => {
return document.querySelectorAll('.item').length;
});
Form Interaction
const form = new FormInteractor(browser);
await form.fill('input[name="username"]', 'john_doe');
await form.fillMultiple([
{ selector: 'input[name="email"]', value: 'john@example.com' },
{ selector: 'input[name="password"]', value: 'secret123' }
]);
await form.click('button[type="submit"]');
await form.select('select[name="country"]', 'US');
await form.check('input[name="terms"]');
await form.submit('form#login-form');
Session Management
const sessions = new SessionManager();
const sessionId = await sessions.create({ persistent: true });
const session = await sessions.get(sessionId);
const allSessions = await sessions.list();
await sessions.close(sessionId);
await sessions.clear();
Configuration
Environment Variables
BROWSER_HEADLESS=true
BROWSER_SANDBOX=true
BROWSER_TIMEOUT=30000
BROWSER_USER_AGENT=
RATE_LIMIT_DELAY=1000
RATE_LIMIT_MAX_REQUESTS=100
RATE_LIMIT_RANDOMIZE=true
SECURITY_BLOCK_ADS=true
SECURITY_BLOCK_TRACKERS=true
SECURITY_ALLOWED_DOMAINS=
SECURITY_DENIED_PATTERNS=
SCREENSHOT_DIR="./skills/browser-access/screenshots"
PDF_DIR="./skills/browser-access/exports"
SESSION_DIR="./skills/browser-access/sessions"
Security Configuration
const securityConfig = {
allowedDomains: ['github.com', 'npmjs.com', 'example.com'],
deniedPatterns: [
/.*\.exe$/,
/.*malware.*/,
/.*phishing.*/
],
blockResources: [
'image',
'media',
'font',
'stylesheet'
],
acceptCookies: false,
clearCookiesOnClose: true,
allowJavaScript: true,
sandboxJavaScript: true
};
Usage Examples
Basic Web Scraping
node browser-controller.js --scrape https://github.com/trending
node browser-controller.js --scrape https://example.com --selector ".main-content"
node browser-controller.js --scrape https://example.com --extract links
Screenshot Capture
node browser-controller.js --screenshot https://example.com --full-page
node browser-controller.js --screenshot https://example.com --selector "#hero"
node browser-controller.js --screenshot https://example.com --output ./my-screenshot.png
Form Interaction
node browser-controller.js --interact << EOF
{
"url": "https://example.com/login",
"actions": [
{ "type": "fill", "selector": "input[name=username]", "value": "user" },
{ "type": "fill", "selector": "input[name=password]", "value": "pass" },
{ "type": "click", "selector": "button[type=submit]" }
]
}
EOF
PDF Export
node browser-controller.js --pdf https://example.com
node browser-controller.js --pdf https://example.com --options '{"format": "A4", "printBackground": true}'
Integration with Explorer Agent
The browser access skill integrates with the Explorer agent for autonomous web research:
const explorer = new ExplorerAgent();
const browser = new BrowserController();
async function researchTopic(topic) {
await browser.navigate(`https://github.com/search?q=${encodeURIComponent(topic)}`);
const repos = await scraper.extractMultiple([
{ name: 'title', selector: '.repo-list-item h3 a' },
{ name: 'description', selector: '.repo-list-item p' },
{ name: 'stars', selector: '.stars' }
]);
await browser.screenshot({
path: `./research/${topic}-${Date.now()}.png`
});
return repos;
}
Explorer Agent Commands
const browserSkill = require('../browser-access/browser-controller');
async function scanGitHub() {
const results = await browserSkill.execute({
command: 'scrape',
url: 'https://github.com/trending/javascript',
extract: {
repositories: {
selector: '.repo-list-item',
fields: [
{ name: 'name', selector: 'h3 a' },
{ name: 'description', selector: 'p' },
{ name: 'stars', selector: '[aria-label="stars"]' }
]
}
}
});
return results.repositories;
}
Security Considerations
Sandboxing
- Browser runs in isolated context with restricted permissions
- No access to local filesystem except designated output directories
- Network requests filtered through domain whitelist
- Cookies cleared on session end
Rate Limiting
- Configurable delay between requests (default: 1000ms)
- Maximum requests per session (default: 100)
- Random jitter added to avoid detection patterns
- Automatic backoff on rate limit detection
Content Security
- JavaScript execution can be disabled for untrusted sites
- Resource blocking for ads, trackers, and unnecessary content
- URL pattern matching to block malicious sites
- Screenshot and PDF output sanitization
Error Handling
try {
await browser.navigate('https://example.com');
} catch (error) {
if (error.name === 'TimeoutError') {
} else if (error.name === 'NavigationError') {
} else if (error.name === 'RateLimitError') {
}
}
Performance Optimization
- Request Interception: Block unnecessary resources (images, fonts, CSS)
- Connection Reuse: Keep browser instance alive for multiple operations
- Lazy Loading: Wait for content to load before extraction
- Concurrent Tabs: Multiple pages in same browser instance
- Memory Management: Automatic cleanup of closed sessions
Dependencies
puppeteer - Headless Chrome/Chromium control
puppeteer-extra - Extended Puppeteer with plugins
puppeteer-extra-plugin-stealth - Avoid bot detection
puppeteer-extra-plugin-adblocker - Block ads and trackers
Files
Browser Access - Explore the web, gather intelligence.