agentleFS
weininghuiweininghui/skills/browserless-agent/SKILL.md

browserless-agent

Skill1 starsChanged 12 days agoMITView on GitHub

Professional web automation with headless browser - navigate, scrape, automate, test, and interact with any website.

The file

Show its rules and text

We split this skill into the rules it gives an agent

22 rules. About 0 are common, 17 are distinctive, and 5 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈17

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Dynamic Content: Wait for selectors, network idle, custom conditions

    line 25
  2. Very specific:

    Add /playwright/chromium if endpoint is not specified

    line 60
  3. Distinctive:

    Wait for page to finish loading.

    line 97
  4. Distinctive:

    Check a checkbox or radio button.

    line 191
  5. Distinctive:

    Wait for element to appear.

    line 293
  6. Distinctive:

    Wait for specified milliseconds.

    line 300
  7. Distinctive:

    Wait for JavaScript expression to return truthy.

    line 306
  8. Distinctive:

    Wait for navigation to complete.

    line 315
  9. Distinctive:

    Check if element is visible.

    line 324
  10. Distinctive:

    Check if element is enabled.

    line 330
  11. Distinctive:

    Check if checkbox/radio is checked.

    line 336
  12. Distinctive:

    Check if element exists in DOM.

    line 342
  13. Distinctive:

    All browser actions are isolated in the Browserless container

    line 618
  14. Distinctive:

    No local browser installation required

    line 619
  15. Very specific:

    Verify BROWSERLESS_WS URL is correct

    line 624
  16. Distinctive:

    Check if token is valid and not expired

    line 625
  17. Distinctive:

    Ensure network allows WebSocket connections

    line 626
  18. Very specific:

    Use wait_for_selector before interacting with dynamic content

    line 630
  19. Very specific:

    Consider using wait_until: "networkidle" for AJAX-heavy sites

    line 631
  20. Distinctive:

    Verify selector using browser DevTools

    line 634
  21. Very specific:

    Wait for element to load with wait_for_selector

    line 635
  22. Distinctive:

    Check if element is inside an iframe

    line 636

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

迁移说明:本技能原为 OpenClaw / ClawHub 生态技能,现已转为 WorkBuddy 技能规范。正文如出现 openclaw / clawhub / claw 命令或 ~/.openclaw 路径,请忽略该命令形式,改用 WorkBuddy 等价操作:技能目录 = ~/.workbuddy/skills/<name>/;装包用 pip / npm;联网用 WebSearch / WebFetch;读写文件用 Read / Write / Edit;执行命令用 Bash(Windows 走 PowerShell 工具)。

运行依赖:需要环境变量 BROWSERLESS_URL(未配置则该技能不可用);缺失时先安装 / 配置,再执行正文步骤。

Browserless Agent 🌐

A comprehensive web automation skill for OpenClaw that provides 30+ browser actions including navigation, data extraction, form filling, screenshot capture, PDF generation, file handling, and advanced web scraping capabilities.

🚀 Features

  • Navigation: Full control over page navigation, redirects, and history
  • Data Extraction: Get text, attributes, HTML, computed styles, and structured data
  • Form Automation: Type text, click buttons, select options, upload files
  • Visual Capture: Screenshots (full page, element-only, viewport)
  • Content Generation: Save pages as PDF with custom options
  • Advanced Interactions: Hover, drag-drop, keyboard shortcuts, scrolling
  • Multi-tab Support: Manage multiple pages and windows
  • Network Control: Intercept requests, modify headers, block resources
  • Storage Access: Manage cookies, localStorage, sessionStorage
  • Dynamic Content: Wait for selectors, network idle, custom conditions
  • iFrames: Interact with nested frame content
  • Browser State: Emulate devices, set geolocation, handle dialogs

🔧 Configuration

This skill requires the BROWSERLESS_URL environment variable to be configured in OpenClaw. Optionally, you can also set BROWSERLESS_TOKEN for authentication.

To set it up:

  1. Open OpenClaw settings
  2. Navigate to Skills → browserless-agent
  3. Enter your Browserless base URL in the API Key field
  4. (Optional) Add BROWSERLESS_TOKEN in the env section for token authentication

Configuration Examples:

Cloud Service (with token):

BROWSERLESS_URL=wss://chrome.browserless.io
BROWSERLESS_TOKEN=your-token-here

Local Service (no token):

BROWSERLESS_URL=ws://localhost:3000

Custom Endpoint:

BROWSERLESS_URL=wss://your-host.com/playwright/chromium
BROWSERLESS_TOKEN=optional-token

The skill will automatically:

  • Add /playwright/chromium if endpoint is not specified
  • Append token as query parameter if BROWSERLESS_TOKEN is set
  • Work with or without authentication token

Get your Browserless service at: browserless.io

Get your Browserless service at: browserless.io

📖 Available Actions

Navigation & Page Control

navigate

Navigate to a URL.

{"url": "https://example.com"}

go_back

Navigate to previous page in history.

{}

go_forward

Navigate to next page in history.

{}

reload

Reload the current page.

{"hard": false}

wait_for_load

Wait for page to finish loading.

{"timeout": 30000}

Data Extraction

get_text

Extract text content from element(s).

{"selector": "h1", "all": false}

get_attribute

Get attribute value from element(s).

{"selector": "img", "attribute": "src", "all": false}

get_html

Get inner or outer HTML of element(s).

{"selector": "article", "outer": false, "all": false}

get_value

Get input value from form element(s).

{"selector": "input[name='email']"}

get_style

Get computed CSS style property.

{"selector": ".box", "property": "background-color"}

get_multiple

Extract multiple pieces of data at once.

{
  "extractions": [
    {"name": "title", "selector": "h1", "type": "text"},
    {"name": "image", "selector": "img", "type": "attribute", "attribute": "src"},
    {"name": "price", "selector": ".price", "type": "text"}
  ]
}

Interaction & Input

type_text

Type text into an element.

{"selector": "input[type='search']", "text": "hello world", "delay": 0, "clear": true}

click

Click on an element.

{"selector": "button.submit", "force": false, "delay": 0}

double_click

Double-click on an element.

{"selector": ".item"}

right_click

Right-click (context menu) on an element.

{"selector": ".context-target"}

hover

Move mouse over an element.

{"selector": ".menu-item"}

focus

Focus on an element.

{"selector": "input"}

select_option

Select option(s) in a dropdown.

{"selector": "select", "values": ["option1", "option2"]}

check

Check a checkbox or radio button.

{"selector": "input[type='checkbox']"}

uncheck

Uncheck a checkbox.

{"selector": "input[type='checkbox']"}

upload_file

Upload file(s) to file input.

{"selector": "input[type='file']", "files": ["path/to/file.pdf"]}

press_key

Press keyboard key(s).

{"key": "Enter"}

Common keys: Enter, Tab, Escape, ArrowDown, Control+A, etc.

keyboard_type

Type text with keyboard (supports shortcuts).

{"text": "Hello World"}

Scrolling & Position

scroll_to

Scroll to specific position.

{"x": 0, "y": 500}

scroll_into_view

Scroll element into viewport.

{"selector": ".footer"}

scroll_to_bottom

Scroll to bottom of page.

{}

scroll_to_top

Scroll to top of page.

{}

Visual & Capture

screenshot

Take screenshot of page or element.

{
  "path": "screenshot.png",
  "full_page": true,
  "selector": null,
  "quality": 90,
  "type": "png"
}

pdf

Generate PDF from current page.

{
  "path": "page.pdf",
  "format": "A4",
  "landscape": false,
  "margin": {"top": "1cm", "right": "1cm", "bottom": "1cm", "left": "1cm"},
  "print_background": true
}

Evaluation & Execution

evaluate

Execute JavaScript in page context.

{"expression": "document.title"}

evaluate_function

Execute JavaScript function with arguments.

{
  "function": "(x, y) => x + y",
  "args": [5, 10]
}

Waiting & Timing

wait_for_selector

Wait for element to appear.

{"selector": ".dynamic-content", "timeout": 10000, "state": "visible"}

States: visible, hidden, attached, detached

wait_for_timeout

Wait for specified milliseconds.

{"timeout": 2000}

wait_for_function

Wait for JavaScript expression to return truthy.

{
  "expression": "() => document.readyState === 'complete'",
  "timeout": 10000
}

wait_for_navigation

Wait for navigation to complete.

{"timeout": 30000, "wait_until": "networkidle"}

wait_until options: load, domcontentloaded, networkidle

Element State Checking

is_visible

Check if element is visible.

{"selector": ".modal"}

is_enabled

Check if element is enabled.

{"selector": "button"}

is_checked

Check if checkbox/radio is checked.

{"selector": "input[type='checkbox']"}

element_exists

Check if element exists in DOM.

{"selector": ".optional-element"}

element_count

Count elements matching selector.

{"selector": ".list-item"}

Storage & Cookies

get_cookies

Get all cookies or specific cookie.

{"name": "session_id"}

set_cookie

Set a cookie.

{
  "name": "user_preference",
  "value": "dark_mode",
  "domain": "example.com",
  "path": "/",
  "expires": 1735689600,
  "httpOnly": false,
  "secure": true,
  "sameSite": "Lax"
}

delete_cookies

Delete cookies.

{"name": "session_id"}

Omit name to delete all cookies.

get_local_storage

Get localStorage item.

{"key": "user_data"}

set_local_storage

Set localStorage item.

{"key": "theme", "value": "dark"}

clear_local_storage

Clear all localStorage.

{}

Network & Requests

set_extra_headers

Set extra HTTP headers for all requests.

{
  "headers": {
    "Authorization": "Bearer token123",
    "X-Custom-Header": "value"
  }
}

block_resources

Block specific resource types.

{"types": ["image", "stylesheet", "font"]}

Types: document, stylesheet, image, media, font, script, xhr, fetch, other

get_page_info

Get comprehensive page information.

{}

Returns: title, url, html (optional), viewport size, etc.

iFrame Handling

get_frame_text

Get text from element inside iframe.

{
  "frame_selector": "iframe#content",
  "selector": "h1"
}

click_in_frame

Click element inside iframe.

{
  "frame_selector": "iframe#content",
  "selector": "button"
}

Multi-Page/Tab

new_page

Open a new page/tab.

{"url": "https://example.com"}

close_page

Close a specific page.

{"index": 1}

switch_page

Switch to a different page.

{"index": 0}

list_pages

List all open pages.

{}

Browser Context

set_viewport

Set viewport size.

{"width": 1920, "height": 1080}

emulate_device

Emulate mobile device.

{"device": "iPhone 12"}

Common devices: iPhone 12, iPad Pro, Galaxy S21, Pixel 5

set_geolocation

Set geolocation.

{
  "latitude": 37.7749,
  "longitude": -122.4194,
  "accuracy": 100
}

set_user_agent

Set custom user agent.

{"user_agent": "Mozilla/5.0..."}

Advanced Automation

drag_and_drop

Drag element and drop on target.

{
  "source": ".draggable",
  "target": ".drop-zone"
}

fill_form

Fill multiple form fields at once.

{
  "fields": {
    "input[name='email']": "user@example.com",
    "input[name='password']": "secret123",
    "select[name='country']": "US"
  }
}

extract_table

Extract data from HTML table.

{
  "selector": "table.data",
  "headers": true
}

extract_links

Extract all links from page.

{
  "selector": "a",
  "filter": "^https://example\\.com"
}

handle_dialog

Set how to handle JavaScript dialogs (alert/confirm/prompt).

{
  "action": "accept",
  "text": "Optional prompt response"
}

Actions: accept, dismiss

💡 Usage Examples

Example 1: Web Scraping

python main.py get_multiple '{
  "url": "https://news.ycombinator.com",
  "extractions": [
    {"name": "titles", "selector": ".titleline > a", "type": "text", "all": true},
    {"name": "links", "selector": ".titleline > a", "type": "attribute", "attribute": "href", "all": true}
  ]
}'

Example 2: Form Automation

python main.py fill_form '{
  "url": "https://example.com/contact",
  "fields": {
    "input[name='name']": "John Doe",
    "input[name='email']": "john@example.com",
    "textarea[name='message']": "Hello!"
  }
}'

Example 3: Screenshot with Element Highlight

python main.py screenshot '{
  "url": "https://example.com",
  "selector": ".hero-section",
  "path": "hero.png",
  "full_page": false
}'

Example 4: PDF Generation

python main.py pdf '{
  "url": "https://example.com/report",
  "path": "report.pdf",
  "format": "A4",
  "margin": {"top": "2cm", "bottom": "2cm"}
}'

🎯 OpenClaw Integration

To use this skill from OpenClaw, the agent can automatically invoke these actions. Examples:

User: "Take a screenshot of example.com"
Agent: Executes screenshot action with the URL

User: "What's the title of wikipedia.org?"
Agent: Navigates to Wikipedia and extracts text from the title element

User: "Search for 'Python' on Google and get the first result link"
Agent: Navigates to Google, types in search, clicks search, extracts first result

🔒 Security Notes

  • Browserless connection uses WebSocket over TLS (wss://)
  • Credentials are never logged or exposed in responses
  • All browser actions are isolated in the Browserless container
  • No local browser installation required

🐛 Troubleshooting

Connection fails:

  • Verify BROWSERLESS_WS URL is correct
  • Check if token is valid and not expired
  • Ensure network allows WebSocket connections

Timeout errors:

  • Increase timeout values for slow-loading pages
  • Use wait_for_selector before interacting with dynamic content
  • Consider using wait_until: "networkidle" for AJAX-heavy sites

Element not found:

  • Verify selector using browser DevTools
  • Wait for element to load with wait_for_selector
  • Check if element is inside an iframe

📚 Resources

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.