Browser Automation Core
by @stefanferreira
Core browser automation library for OpenClaw agents. Provides reusable navigation, interaction, and capture capabilities for both Facet (Onshape learning) an...
clawhub install browser-automation-coreπ About This Skill
name: browser-automation-core description: Core browser automation library for OpenClaw agents. Provides reusable navigation, interaction, and capture capabilities for both Facet (Onshape learning) and Ace (competition entry). Use when any agent needs to automate web browser interactions.
Browser Automation Core Skill
Purpose
A reusable browser automation library that provides common web interaction capabilities for multiple OpenClaw agents. Designed to be extended by agent-specific skills while maintaining a single, well-tested core.Primary Users
1. Facet - Onshape CAD learning automation 2. Ace - Competition entry and form filling 3. Future agents - Any web automation needsArchitecture
browser-automation-core/ # This skill
βββ navigation/ # URL loading, waiting
βββ interaction/ # Click, type, select
βββ capture/ # Screenshot, HTML capture
βββ forms/ # Form detection and filling
βββ sessions/ # Tab/window managementfacets-browser-learning/ # Facet-specific extension
βββ uses core + Onshape-specific logic
ace-competition-automation/ # Ace-specific extension
βββ uses core + competition-specific logic
Core Capabilities
Navigation
Interaction
Capture
Forms
Sessions
Quick Start
Installation
# Install from ClawHub (when published)
npx clawhub@latest install browser-automation-coreOr use local development version
cp -r /path/to/skill /root/.openclaw/workspace/skills/
Basic Usage
# Example: Navigate and take screenshot
from browser_core import BrowserAutomationbrowser = BrowserAutomation()
browser.navigate("https://example.com")
browser.take_screenshot("example.png")
browser.close()
Agent-Specific Examples
#### For Facet (Onshape Learning)
from browser_core import BrowserAutomation
from facets_onshape import OnshapeAutomationbrowser = BrowserAutomation()
onshape = OnshapeAutomation(browser)
Login to Onshape
onshape.login(email="facet.ai.oc@gmail.com", password="***")Navigate to tutorials
onshape.navigate_to_tutorial("getting-started")Complete tutorial steps
onshape.complete_tutorial_step(1)
onshape.take_progress_screenshot()
#### For Ace (Competition Entry)
from browser_core import BrowserAutomation
from ace_competition import CompetitionAutomationbrowser = BrowserAutomation()
competition = CompetitionAutomation(browser)
Navigate to competition
competition.navigate_to_competition("https://competition.example.com")Fill entry form
entry_data = {
"name": "Stef Ferreira",
"email": "ace@supplystoreafrica.com",
"phone": "+27726386189"
}
competition.fill_entry_form(entry_data)Submit and capture proof
competition.submit_entry()
competition.capture_submission_proof()
Configuration
Environment Variables
# Browser settings
export BROWSER_HEADLESS="true" # Run without display
export BROWSER_TIMEOUT="30" # Default timeout seconds
export BROWSER_VIEWPORT="1280,720" # Window size
export BROWSER_USER_AGENT="OpenClaw Agent" # Custom user agentCDP settings (OpenClaw browser)
export CDP_URL="http://localhost:18800/json"
export CDP_WEBSOCKET="ws://localhost:18800/devtools/page/..."Storage settings
export SCREENSHOT_DIR="/path/to/screenshots"
export SESSION_DIR="/path/to/sessions"
OpenClaw Integration
{
"skills": {
"browser-automation-core": {
"enabled": true,
"config": {
"cdpUrl": "http://localhost:18800/json",
"headless": true,
"timeout": 30,
"screenshotDir": "/root/.openclaw/workspace/screenshots"
}
}
}
}
Implementation Details
CDP (Chrome DevTools Protocol)
This skill uses OpenClaw's built-in browser via CDP:ws://localhost:18800/devtools/page/...Error Handling
Performance
Extension Points
Creating Agent-Specific Extensions
#### 1. Create Extension Skill
python3 /usr/lib/node_modules/openclaw/skills/skill-creator/scripts/init_skill.py facets-browser-learning
#### 2. Import Core Library
# In extension skill
import sys
sys.path.append("/root/.openclaw/workspace/skills/browser-automation-core")
from browser_core import BrowserAutomationclass OnshapeAutomation:
def __init__(self):
self.browser = BrowserAutomation()
def onshape_specific_method(self):
# Use core capabilities
self.browser.navigate("https://cad.onshape.com")
# Add Onshape-specific logic
#### 3. Add Specialized Logic
Testing Strategy
Unit Tests
# Test core functionality
cd /root/.openclaw/workspace/skills/browser-automation-core
python3 -m pytest tests/unit/
Integration Tests
# Test with actual browser
python3 tests/integration/test_navigation.py
python3 tests/integration/test_forms.py
Agent-Specific Tests
# Test Facet extension
cd /root/.openclaw/workspace/skills/facets-browser-learning
python3 tests/test_onshape_automation.pyTest Ace extension
cd /root/.openclaw/workspace/skills/ace-competition-automation
python3 tests/test_competition_automation.py
Common Use Cases
Use Case 1: Form Filling (Ace)
# Competition entry automation
data = {
"full_name": "Stef Ferreira",
"email": "ace@supplystoreafrica.com",
"phone": "+27726386189",
"address": "123 Street, City, South Africa"
}browser.navigate(competition_url)
browser.fill_form("form#entry-form", data)
browser.click("button[type='submit']")
browser.wait_for_element(".success-message")
browser.take_screenshot("entry_proof.png")
Use Case 2: Tutorial Navigation (Facet)
# Onshape learning automation
browser.navigate("https://cad.onshape.com")
browser.login(credentials) # Custom method in extension
browser.navigate("/learning/tutorials")Complete tutorial
tutorial_steps = browser.extract_tutorial_steps()
for step in tutorial_steps:
browser.complete_step(step) # Custom method
browser.take_screenshot(f"step_{step.number}.png")
browser.capture_certificate()
Use Case 3: Multi-Page Workflow
# Complex automation across multiple pages
browser.open_new_tab()
browser.navigate_to_login()
browser.login(credentials)browser.switch_to_tab(0)
browser.fill_application_form(data)
browser.switch_to_tab(1)
browser.verify_email_confirmation()
browser.capture_all_tabs_screenshots()
Error Recovery Patterns
CORS Issues (Screenshots/Evaluate Not Working)
Problem: Browser automation fails with CORS errors when taking screenshots or evaluating JavaScript.Solution: Ensure browser is started with --remote-allow-origins=* flag:
# Browser startup command must include:
--remote-debugging-port=18800 --remote-allow-origins=*
Verification:
curl http://localhost:18800/json/version
Should return browser info without CORS errors
Network Issues
try:
browser.navigate(url)
except NetworkError:
browser.reload()
browser.wait_for_network_idle()
# Retry operation
Element Not Found
# Try multiple selectors
selectors = [
"button.submit",
"input[type='submit']",
".submit-button",
"//button[contains(text(), 'Submit')]"
]for selector in selectors:
if browser.element_exists(selector):
browser.click(selector)
break
Form Validation Errors
browser.submit_form()
if browser.has_validation_errors():
errors = browser.get_validation_errors()
for field, message in errors:
browser.fix_field(field, message)
browser.submit_form() # Retry
Performance Optimization
Batch Operations
# Instead of sequential commands
browser.click("button1")
browser.click("button2")
browser.type("input1", "text")Use batch commands
commands = [
{"method": "click", "selector": "button1"},
{"method": "click", "selector": "button2"},
{"method": "type", "selector": "input1", "text": "text"}
]
browser.execute_batch(commands)
Caching Strategies
# Cache page structure
if not browser.has_cached_structure(url):
structure = browser.extract_page_structure()
browser.cache_structure(url, structure)Use cached selectors
selectors = browser.get_cached_selectors(url)
Security Considerations
Credential Management
Session Isolation
Input Validation
Maintenance
Versioning
Updates
Monitoring
Contributing
Adding New Features
1. Check if feature belongs in core or extension 2. Write tests for new functionality 3. Update documentation 4. Submit pull requestReporting Issues
1. Include agent context (Facet, Ace, etc.) 2. Provide reproduction steps 3. Include screenshots/logs 4. Suggest possible solutionsExtension Development
1. Follow core API patterns 2. Reuse existing utilities when possible 3. Write agent-specific tests 4. Document extension capabilitiesReferences
CDP Documentation
Related Skills
facets-browser-learning - Facet extensionace-competition-automation - Ace extensionbrowser-testing - Testing utilitiesExternal Resources
Version: 1.0.0 Last Updated: 2026-03-30 Maintainer: Bob (OpenClaw Agent) License: MIT Status: Active Development
π‘ Examples
Installation
# Install from ClawHub (when published)
npx clawhub@latest install browser-automation-coreOr use local development version
cp -r /path/to/skill /root/.openclaw/workspace/skills/
Basic Usage
# Example: Navigate and take screenshot
from browser_core import BrowserAutomationbrowser = BrowserAutomation()
browser.navigate("https://example.com")
browser.take_screenshot("example.png")
browser.close()
Agent-Specific Examples
#### For Facet (Onshape Learning)
from browser_core import BrowserAutomation
from facets_onshape import OnshapeAutomationbrowser = BrowserAutomation()
onshape = OnshapeAutomation(browser)
Login to Onshape
onshape.login(email="facet.ai.oc@gmail.com", password="***")Navigate to tutorials
onshape.navigate_to_tutorial("getting-started")Complete tutorial steps
onshape.complete_tutorial_step(1)
onshape.take_progress_screenshot()
#### For Ace (Competition Entry)
from browser_core import BrowserAutomation
from ace_competition import CompetitionAutomationbrowser = BrowserAutomation()
competition = CompetitionAutomation(browser)
Navigate to competition
competition.navigate_to_competition("https://competition.example.com")Fill entry form
entry_data = {
"name": "Stef Ferreira",
"email": "ace@supplystoreafrica.com",
"phone": "+27726386189"
}
competition.fill_entry_form(entry_data)Submit and capture proof
competition.submit_entry()
competition.capture_submission_proof()
βοΈ Configuration
Environment Variables
# Browser settings
export BROWSER_HEADLESS="true" # Run without display
export BROWSER_TIMEOUT="30" # Default timeout seconds
export BROWSER_VIEWPORT="1280,720" # Window size
export BROWSER_USER_AGENT="OpenClaw Agent" # Custom user agentCDP settings (OpenClaw browser)
export CDP_URL="http://localhost:18800/json"
export CDP_WEBSOCKET="ws://localhost:18800/devtools/page/..."Storage settings
export SCREENSHOT_DIR="/path/to/screenshots"
export SESSION_DIR="/path/to/sessions"
OpenClaw Integration
{
"skills": {
"browser-automation-core": {
"enabled": true,
"config": {
"cdpUrl": "http://localhost:18800/json",
"headless": true,
"timeout": 30,
"screenshotDir": "/root/.openclaw/workspace/screenshots"
}
}
}
}