Install
openclaw skills install browser-automation-coreCore 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.
openclaw skills install browser-automation-coreA 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.
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 management
facets-browser-learning/ # Facet-specific extension
└── uses core + Onshape-specific logic
ace-competition-automation/ # Ace-specific extension
└── uses core + competition-specific logic
# Install from ClawHub (when published)
npx clawhub@latest install browser-automation-core
# Or use local development version
cp -r /path/to/skill /root/.openclaw/workspace/skills/
# Example: Navigate and take screenshot
from browser_core import BrowserAutomation
browser = BrowserAutomation()
browser.navigate("https://example.com")
browser.take_screenshot("example.png")
browser.close()
from browser_core import BrowserAutomation
from facets_onshape import OnshapeAutomation
browser = 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()
from browser_core import BrowserAutomation
from ace_competition import CompetitionAutomation
browser = 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()
# 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 agent
# CDP 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"
{
"skills": {
"browser-automation-core": {
"enabled": true,
"config": {
"cdpUrl": "http://localhost:18800/json",
"headless": true,
"timeout": 30,
"screenshotDir": "/root/.openclaw/workspace/screenshots"
}
}
}
}
This skill uses OpenClaw's built-in browser via CDP:
ws://localhost:18800/devtools/page/...python3 /usr/lib/node_modules/openclaw/skills/skill-creator/scripts/init_skill.py facets-browser-learning
# In extension skill
import sys
sys.path.append("/root/.openclaw/workspace/skills/browser-automation-core")
from browser_core import BrowserAutomation
class 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
# Test core functionality
cd /root/.openclaw/workspace/skills/browser-automation-core
python3 -m pytest tests/unit/
# Test with actual browser
python3 tests/integration/test_navigation.py
python3 tests/integration/test_forms.py
# Test Facet extension
cd /root/.openclaw/workspace/skills/facets-browser-learning
python3 tests/test_onshape_automation.py
# Test Ace extension
cd /root/.openclaw/workspace/skills/ace-competition-automation
python3 tests/test_competition_automation.py
# 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")
# 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()
# 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()
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
try:
browser.navigate(url)
except NetworkError:
browser.reload()
browser.wait_for_network_idle()
# Retry operation
# 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
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
# 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)
# 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)
facets-browser-learning - Facet extensionace-competition-automation - Ace extensionbrowser-testing - Testing utilitiesVersion: 1.0.0
Last Updated: 2026-03-30
Maintainer: Bob (OpenClaw Agent)
License: MIT
Status: Active Development