{
  "schemaVersion": "1.0",
  "item": {
    "slug": "browserless-agent",
    "name": "Browserless Agent",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/raff-lima/browserless-agent",
    "canonicalUrl": "https://clawhub.ai/raff-lima/browserless-agent",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/browserless-agent",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=browserless-agent",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "CHANGELOG.md",
      "CONFIGURATION.md",
      "README.md",
      "SKILL.md",
      "examples/quick_test.py",
      "main.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "slug": "browserless-agent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-01T02:29:14.398Z",
      "expiresAt": "2026-05-08T02:29:14.398Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=browserless-agent",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=browserless-agent",
        "contentDisposition": "attachment; filename=\"browserless-agent-0.1.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "browserless-agent"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/browserless-agent"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/browserless-agent",
    "agentPageUrl": "https://openagent3.xyz/skills/browserless-agent/agent",
    "manifestUrl": "https://openagent3.xyz/skills/browserless-agent/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/browserless-agent/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Browserless Agent 🌐",
        "body": "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."
      },
      {
        "title": "🚀 Features",
        "body": "Navigation: Full control over page navigation, redirects, and history\nData Extraction: Get text, attributes, HTML, computed styles, and structured data\nForm Automation: Type text, click buttons, select options, upload files\nVisual Capture: Screenshots (full page, element-only, viewport)\nContent Generation: Save pages as PDF with custom options\nAdvanced Interactions: Hover, drag-drop, keyboard shortcuts, scrolling\nMulti-tab Support: Manage multiple pages and windows\nNetwork Control: Intercept requests, modify headers, block resources\nStorage Access: Manage cookies, localStorage, sessionStorage\nDynamic Content: Wait for selectors, network idle, custom conditions\niFrames: Interact with nested frame content\nBrowser State: Emulate devices, set geolocation, handle dialogs"
      },
      {
        "title": "🔧 Configuration",
        "body": "This skill requires the BROWSERLESS_URL environment variable to be configured in OpenClaw.\nOptionally, you can also set BROWSERLESS_TOKEN for authentication.\n\nTo set it up:\n\nOpen OpenClaw settings\nNavigate to Skills → browserless-agent\nEnter your Browserless base URL in the API Key field\n(Optional) Add BROWSERLESS_TOKEN in the env section for token authentication\n\nConfiguration Examples:"
      },
      {
        "title": "Cloud Service (with token):",
        "body": "BROWSERLESS_URL=wss://chrome.browserless.io\nBROWSERLESS_TOKEN=your-token-here"
      },
      {
        "title": "Local Service (no token):",
        "body": "BROWSERLESS_URL=ws://localhost:3000"
      },
      {
        "title": "Custom Endpoint:",
        "body": "BROWSERLESS_URL=wss://your-host.com/playwright/chromium\nBROWSERLESS_TOKEN=optional-token\n\nThe skill will automatically:\n\nAdd /playwright/chromium if endpoint is not specified\nAppend token as query parameter if BROWSERLESS_TOKEN is set\nWork with or without authentication token\n\nGet your Browserless service at: browserless.io\n\nGet your Browserless service at: browserless.io"
      },
      {
        "title": "Navigation & Page Control",
        "body": "navigate\n\nNavigate to a URL.\n\n{\"url\": \"https://example.com\"}\n\ngo_back\n\nNavigate to previous page in history.\n\n{}\n\ngo_forward\n\nNavigate to next page in history.\n\n{}\n\nreload\n\nReload the current page.\n\n{\"hard\": false}\n\nwait_for_load\n\nWait for page to finish loading.\n\n{\"timeout\": 30000}"
      },
      {
        "title": "Data Extraction",
        "body": "get_text\n\nExtract text content from element(s).\n\n{\"selector\": \"h1\", \"all\": false}\n\nget_attribute\n\nGet attribute value from element(s).\n\n{\"selector\": \"img\", \"attribute\": \"src\", \"all\": false}\n\nget_html\n\nGet inner or outer HTML of element(s).\n\n{\"selector\": \"article\", \"outer\": false, \"all\": false}\n\nget_value\n\nGet input value from form element(s).\n\n{\"selector\": \"input[name='email']\"}\n\nget_style\n\nGet computed CSS style property.\n\n{\"selector\": \".box\", \"property\": \"background-color\"}\n\nget_multiple\n\nExtract multiple pieces of data at once.\n\n{\n  \"extractions\": [\n    {\"name\": \"title\", \"selector\": \"h1\", \"type\": \"text\"},\n    {\"name\": \"image\", \"selector\": \"img\", \"type\": \"attribute\", \"attribute\": \"src\"},\n    {\"name\": \"price\", \"selector\": \".price\", \"type\": \"text\"}\n  ]\n}"
      },
      {
        "title": "Interaction & Input",
        "body": "type_text\n\nType text into an element.\n\n{\"selector\": \"input[type='search']\", \"text\": \"hello world\", \"delay\": 0, \"clear\": true}\n\nclick\n\nClick on an element.\n\n{\"selector\": \"button.submit\", \"force\": false, \"delay\": 0}\n\ndouble_click\n\nDouble-click on an element.\n\n{\"selector\": \".item\"}\n\nright_click\n\nRight-click (context menu) on an element.\n\n{\"selector\": \".context-target\"}\n\nhover\n\nMove mouse over an element.\n\n{\"selector\": \".menu-item\"}\n\nfocus\n\nFocus on an element.\n\n{\"selector\": \"input\"}\n\nselect_option\n\nSelect option(s) in a dropdown.\n\n{\"selector\": \"select\", \"values\": [\"option1\", \"option2\"]}\n\ncheck\n\nCheck a checkbox or radio button.\n\n{\"selector\": \"input[type='checkbox']\"}\n\nuncheck\n\nUncheck a checkbox.\n\n{\"selector\": \"input[type='checkbox']\"}\n\nupload_file\n\nUpload file(s) to file input.\n\n{\"selector\": \"input[type='file']\", \"files\": [\"path/to/file.pdf\"]}\n\npress_key\n\nPress keyboard key(s).\n\n{\"key\": \"Enter\"}\n\nCommon keys: Enter, Tab, Escape, ArrowDown, Control+A, etc.\n\nkeyboard_type\n\nType text with keyboard (supports shortcuts).\n\n{\"text\": \"Hello World\"}"
      },
      {
        "title": "Scrolling & Position",
        "body": "scroll_to\n\nScroll to specific position.\n\n{\"x\": 0, \"y\": 500}\n\nscroll_into_view\n\nScroll element into viewport.\n\n{\"selector\": \".footer\"}\n\nscroll_to_bottom\n\nScroll to bottom of page.\n\n{}\n\nscroll_to_top\n\nScroll to top of page.\n\n{}"
      },
      {
        "title": "Visual & Capture",
        "body": "screenshot\n\nTake screenshot of page or element.\n\n{\n  \"path\": \"screenshot.png\",\n  \"full_page\": true,\n  \"selector\": null,\n  \"quality\": 90,\n  \"type\": \"png\"\n}\n\npdf\n\nGenerate PDF from current page.\n\n{\n  \"path\": \"page.pdf\",\n  \"format\": \"A4\",\n  \"landscape\": false,\n  \"margin\": {\"top\": \"1cm\", \"right\": \"1cm\", \"bottom\": \"1cm\", \"left\": \"1cm\"},\n  \"print_background\": true\n}"
      },
      {
        "title": "Evaluation & Execution",
        "body": "evaluate\n\nExecute JavaScript in page context.\n\n{\"expression\": \"document.title\"}\n\nevaluate_function\n\nExecute JavaScript function with arguments.\n\n{\n  \"function\": \"(x, y) => x + y\",\n  \"args\": [5, 10]\n}"
      },
      {
        "title": "Waiting & Timing",
        "body": "wait_for_selector\n\nWait for element to appear.\n\n{\"selector\": \".dynamic-content\", \"timeout\": 10000, \"state\": \"visible\"}\n\nStates: visible, hidden, attached, detached\n\nwait_for_timeout\n\nWait for specified milliseconds.\n\n{\"timeout\": 2000}\n\nwait_for_function\n\nWait for JavaScript expression to return truthy.\n\n{\n  \"expression\": \"() => document.readyState === 'complete'\",\n  \"timeout\": 10000\n}\n\nwait_for_navigation\n\nWait for navigation to complete.\n\n{\"timeout\": 30000, \"wait_until\": \"networkidle\"}\n\nwait_until options: load, domcontentloaded, networkidle"
      },
      {
        "title": "Element State Checking",
        "body": "is_visible\n\nCheck if element is visible.\n\n{\"selector\": \".modal\"}\n\nis_enabled\n\nCheck if element is enabled.\n\n{\"selector\": \"button\"}\n\nis_checked\n\nCheck if checkbox/radio is checked.\n\n{\"selector\": \"input[type='checkbox']\"}\n\nelement_exists\n\nCheck if element exists in DOM.\n\n{\"selector\": \".optional-element\"}\n\nelement_count\n\nCount elements matching selector.\n\n{\"selector\": \".list-item\"}"
      },
      {
        "title": "Storage & Cookies",
        "body": "get_cookies\n\nGet all cookies or specific cookie.\n\n{\"name\": \"session_id\"}\n\nset_cookie\n\nSet a cookie.\n\n{\n  \"name\": \"user_preference\",\n  \"value\": \"dark_mode\",\n  \"domain\": \"example.com\",\n  \"path\": \"/\",\n  \"expires\": 1735689600,\n  \"httpOnly\": false,\n  \"secure\": true,\n  \"sameSite\": \"Lax\"\n}\n\ndelete_cookies\n\nDelete cookies.\n\n{\"name\": \"session_id\"}\n\nOmit name to delete all cookies.\n\nget_local_storage\n\nGet localStorage item.\n\n{\"key\": \"user_data\"}\n\nset_local_storage\n\nSet localStorage item.\n\n{\"key\": \"theme\", \"value\": \"dark\"}\n\nclear_local_storage\n\nClear all localStorage.\n\n{}"
      },
      {
        "title": "Network & Requests",
        "body": "set_extra_headers\n\nSet extra HTTP headers for all requests.\n\n{\n  \"headers\": {\n    \"Authorization\": \"Bearer token123\",\n    \"X-Custom-Header\": \"value\"\n  }\n}\n\nblock_resources\n\nBlock specific resource types.\n\n{\"types\": [\"image\", \"stylesheet\", \"font\"]}\n\nTypes: document, stylesheet, image, media, font, script, xhr, fetch, other\n\nget_page_info\n\nGet comprehensive page information.\n\n{}\n\nReturns: title, url, html (optional), viewport size, etc."
      },
      {
        "title": "iFrame Handling",
        "body": "get_frame_text\n\nGet text from element inside iframe.\n\n{\n  \"frame_selector\": \"iframe#content\",\n  \"selector\": \"h1\"\n}\n\nclick_in_frame\n\nClick element inside iframe.\n\n{\n  \"frame_selector\": \"iframe#content\",\n  \"selector\": \"button\"\n}"
      },
      {
        "title": "Multi-Page/Tab",
        "body": "new_page\n\nOpen a new page/tab.\n\n{\"url\": \"https://example.com\"}\n\nclose_page\n\nClose a specific page.\n\n{\"index\": 1}\n\nswitch_page\n\nSwitch to a different page.\n\n{\"index\": 0}\n\nlist_pages\n\nList all open pages.\n\n{}"
      },
      {
        "title": "Browser Context",
        "body": "set_viewport\n\nSet viewport size.\n\n{\"width\": 1920, \"height\": 1080}\n\nemulate_device\n\nEmulate mobile device.\n\n{\"device\": \"iPhone 12\"}\n\nCommon devices: iPhone 12, iPad Pro, Galaxy S21, Pixel 5\n\nset_geolocation\n\nSet geolocation.\n\n{\n  \"latitude\": 37.7749,\n  \"longitude\": -122.4194,\n  \"accuracy\": 100\n}\n\nset_user_agent\n\nSet custom user agent.\n\n{\"user_agent\": \"Mozilla/5.0...\"}"
      },
      {
        "title": "Advanced Automation",
        "body": "drag_and_drop\n\nDrag element and drop on target.\n\n{\n  \"source\": \".draggable\",\n  \"target\": \".drop-zone\"\n}\n\nfill_form\n\nFill multiple form fields at once.\n\n{\n  \"fields\": {\n    \"input[name='email']\": \"user@example.com\",\n    \"input[name='password']\": \"secret123\",\n    \"select[name='country']\": \"US\"\n  }\n}\n\nextract_table\n\nExtract data from HTML table.\n\n{\n  \"selector\": \"table.data\",\n  \"headers\": true\n}\n\nextract_links\n\nExtract all links from page.\n\n{\n  \"selector\": \"a\",\n  \"filter\": \"^https://example\\\\.com\"\n}\n\nhandle_dialog\n\nSet how to handle JavaScript dialogs (alert/confirm/prompt).\n\n{\n  \"action\": \"accept\",\n  \"text\": \"Optional prompt response\"\n}\n\nActions: accept, dismiss"
      },
      {
        "title": "Example 1: Web Scraping",
        "body": "python main.py get_multiple '{\n  \"url\": \"https://news.ycombinator.com\",\n  \"extractions\": [\n    {\"name\": \"titles\", \"selector\": \".titleline > a\", \"type\": \"text\", \"all\": true},\n    {\"name\": \"links\", \"selector\": \".titleline > a\", \"type\": \"attribute\", \"attribute\": \"href\", \"all\": true}\n  ]\n}'"
      },
      {
        "title": "Example 2: Form Automation",
        "body": "python main.py fill_form '{\n  \"url\": \"https://example.com/contact\",\n  \"fields\": {\n    \"input[name='name']\": \"John Doe\",\n    \"input[name='email']\": \"john@example.com\",\n    \"textarea[name='message']\": \"Hello!\"\n  }\n}'"
      },
      {
        "title": "Example 3: Screenshot with Element Highlight",
        "body": "python main.py screenshot '{\n  \"url\": \"https://example.com\",\n  \"selector\": \".hero-section\",\n  \"path\": \"hero.png\",\n  \"full_page\": false\n}'"
      },
      {
        "title": "Example 4: PDF Generation",
        "body": "python main.py pdf '{\n  \"url\": \"https://example.com/report\",\n  \"path\": \"report.pdf\",\n  \"format\": \"A4\",\n  \"margin\": {\"top\": \"2cm\", \"bottom\": \"2cm\"}\n}'"
      },
      {
        "title": "🎯 OpenClaw Integration",
        "body": "To use this skill from OpenClaw, the agent can automatically invoke these actions. Examples:\n\nUser: \"Take a screenshot of example.com\"\nAgent: Executes screenshot action with the URL\n\nUser: \"What's the title of wikipedia.org?\"\nAgent: Navigates to Wikipedia and extracts text from the title element\n\nUser: \"Search for 'Python' on Google and get the first result link\"\nAgent: Navigates to Google, types in search, clicks search, extracts first result"
      },
      {
        "title": "🔒 Security Notes",
        "body": "Browserless connection uses WebSocket over TLS (wss://)\nCredentials are never logged or exposed in responses\nAll browser actions are isolated in the Browserless container\nNo local browser installation required"
      },
      {
        "title": "🐛 Troubleshooting",
        "body": "Connection fails:\n\nVerify BROWSERLESS_WS URL is correct\nCheck if token is valid and not expired\nEnsure network allows WebSocket connections\n\nTimeout errors:\n\nIncrease timeout values for slow-loading pages\nUse wait_for_selector before interacting with dynamic content\nConsider using wait_until: \"networkidle\" for AJAX-heavy sites\n\nElement not found:\n\nVerify selector using browser DevTools\nWait for element to load with wait_for_selector\nCheck if element is inside an iframe"
      },
      {
        "title": "📚 Resources",
        "body": "Playwright Documentation\nCSS Selectors Reference\nBrowserless Documentation"
      }
    ],
    "body": "Browserless Agent 🌐\n\nA 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.\n\n🚀 Features\nNavigation: Full control over page navigation, redirects, and history\nData Extraction: Get text, attributes, HTML, computed styles, and structured data\nForm Automation: Type text, click buttons, select options, upload files\nVisual Capture: Screenshots (full page, element-only, viewport)\nContent Generation: Save pages as PDF with custom options\nAdvanced Interactions: Hover, drag-drop, keyboard shortcuts, scrolling\nMulti-tab Support: Manage multiple pages and windows\nNetwork Control: Intercept requests, modify headers, block resources\nStorage Access: Manage cookies, localStorage, sessionStorage\nDynamic Content: Wait for selectors, network idle, custom conditions\niFrames: Interact with nested frame content\nBrowser State: Emulate devices, set geolocation, handle dialogs\n🔧 Configuration\n\nThis skill requires the BROWSERLESS_URL environment variable to be configured in OpenClaw. Optionally, you can also set BROWSERLESS_TOKEN for authentication.\n\nTo set it up:\n\nOpen OpenClaw settings\nNavigate to Skills → browserless-agent\nEnter your Browserless base URL in the API Key field\n(Optional) Add BROWSERLESS_TOKEN in the env section for token authentication\n\nConfiguration Examples:\n\nCloud Service (with token):\nBROWSERLESS_URL=wss://chrome.browserless.io\nBROWSERLESS_TOKEN=your-token-here\n\nLocal Service (no token):\nBROWSERLESS_URL=ws://localhost:3000\n\nCustom Endpoint:\nBROWSERLESS_URL=wss://your-host.com/playwright/chromium\nBROWSERLESS_TOKEN=optional-token\n\n\nThe skill will automatically:\n\nAdd /playwright/chromium if endpoint is not specified\nAppend token as query parameter if BROWSERLESS_TOKEN is set\nWork with or without authentication token\n\nGet your Browserless service at: browserless.io\n\nGet your Browserless service at: browserless.io\n\n📖 Available Actions\nNavigation & Page Control\nnavigate\n\nNavigate to a URL.\n\n{\"url\": \"https://example.com\"}\n\ngo_back\n\nNavigate to previous page in history.\n\n{}\n\ngo_forward\n\nNavigate to next page in history.\n\n{}\n\nreload\n\nReload the current page.\n\n{\"hard\": false}\n\nwait_for_load\n\nWait for page to finish loading.\n\n{\"timeout\": 30000}\n\nData Extraction\nget_text\n\nExtract text content from element(s).\n\n{\"selector\": \"h1\", \"all\": false}\n\nget_attribute\n\nGet attribute value from element(s).\n\n{\"selector\": \"img\", \"attribute\": \"src\", \"all\": false}\n\nget_html\n\nGet inner or outer HTML of element(s).\n\n{\"selector\": \"article\", \"outer\": false, \"all\": false}\n\nget_value\n\nGet input value from form element(s).\n\n{\"selector\": \"input[name='email']\"}\n\nget_style\n\nGet computed CSS style property.\n\n{\"selector\": \".box\", \"property\": \"background-color\"}\n\nget_multiple\n\nExtract multiple pieces of data at once.\n\n{\n  \"extractions\": [\n    {\"name\": \"title\", \"selector\": \"h1\", \"type\": \"text\"},\n    {\"name\": \"image\", \"selector\": \"img\", \"type\": \"attribute\", \"attribute\": \"src\"},\n    {\"name\": \"price\", \"selector\": \".price\", \"type\": \"text\"}\n  ]\n}\n\nInteraction & Input\ntype_text\n\nType text into an element.\n\n{\"selector\": \"input[type='search']\", \"text\": \"hello world\", \"delay\": 0, \"clear\": true}\n\nclick\n\nClick on an element.\n\n{\"selector\": \"button.submit\", \"force\": false, \"delay\": 0}\n\ndouble_click\n\nDouble-click on an element.\n\n{\"selector\": \".item\"}\n\nright_click\n\nRight-click (context menu) on an element.\n\n{\"selector\": \".context-target\"}\n\nhover\n\nMove mouse over an element.\n\n{\"selector\": \".menu-item\"}\n\nfocus\n\nFocus on an element.\n\n{\"selector\": \"input\"}\n\nselect_option\n\nSelect option(s) in a dropdown.\n\n{\"selector\": \"select\", \"values\": [\"option1\", \"option2\"]}\n\ncheck\n\nCheck a checkbox or radio button.\n\n{\"selector\": \"input[type='checkbox']\"}\n\nuncheck\n\nUncheck a checkbox.\n\n{\"selector\": \"input[type='checkbox']\"}\n\nupload_file\n\nUpload file(s) to file input.\n\n{\"selector\": \"input[type='file']\", \"files\": [\"path/to/file.pdf\"]}\n\npress_key\n\nPress keyboard key(s).\n\n{\"key\": \"Enter\"}\n\n\nCommon keys: Enter, Tab, Escape, ArrowDown, Control+A, etc.\n\nkeyboard_type\n\nType text with keyboard (supports shortcuts).\n\n{\"text\": \"Hello World\"}\n\nScrolling & Position\nscroll_to\n\nScroll to specific position.\n\n{\"x\": 0, \"y\": 500}\n\nscroll_into_view\n\nScroll element into viewport.\n\n{\"selector\": \".footer\"}\n\nscroll_to_bottom\n\nScroll to bottom of page.\n\n{}\n\nscroll_to_top\n\nScroll to top of page.\n\n{}\n\nVisual & Capture\nscreenshot\n\nTake screenshot of page or element.\n\n{\n  \"path\": \"screenshot.png\",\n  \"full_page\": true,\n  \"selector\": null,\n  \"quality\": 90,\n  \"type\": \"png\"\n}\n\npdf\n\nGenerate PDF from current page.\n\n{\n  \"path\": \"page.pdf\",\n  \"format\": \"A4\",\n  \"landscape\": false,\n  \"margin\": {\"top\": \"1cm\", \"right\": \"1cm\", \"bottom\": \"1cm\", \"left\": \"1cm\"},\n  \"print_background\": true\n}\n\nEvaluation & Execution\nevaluate\n\nExecute JavaScript in page context.\n\n{\"expression\": \"document.title\"}\n\nevaluate_function\n\nExecute JavaScript function with arguments.\n\n{\n  \"function\": \"(x, y) => x + y\",\n  \"args\": [5, 10]\n}\n\nWaiting & Timing\nwait_for_selector\n\nWait for element to appear.\n\n{\"selector\": \".dynamic-content\", \"timeout\": 10000, \"state\": \"visible\"}\n\n\nStates: visible, hidden, attached, detached\n\nwait_for_timeout\n\nWait for specified milliseconds.\n\n{\"timeout\": 2000}\n\nwait_for_function\n\nWait for JavaScript expression to return truthy.\n\n{\n  \"expression\": \"() => document.readyState === 'complete'\",\n  \"timeout\": 10000\n}\n\nwait_for_navigation\n\nWait for navigation to complete.\n\n{\"timeout\": 30000, \"wait_until\": \"networkidle\"}\n\n\nwait_until options: load, domcontentloaded, networkidle\n\nElement State Checking\nis_visible\n\nCheck if element is visible.\n\n{\"selector\": \".modal\"}\n\nis_enabled\n\nCheck if element is enabled.\n\n{\"selector\": \"button\"}\n\nis_checked\n\nCheck if checkbox/radio is checked.\n\n{\"selector\": \"input[type='checkbox']\"}\n\nelement_exists\n\nCheck if element exists in DOM.\n\n{\"selector\": \".optional-element\"}\n\nelement_count\n\nCount elements matching selector.\n\n{\"selector\": \".list-item\"}\n\nStorage & Cookies\nget_cookies\n\nGet all cookies or specific cookie.\n\n{\"name\": \"session_id\"}\n\nset_cookie\n\nSet a cookie.\n\n{\n  \"name\": \"user_preference\",\n  \"value\": \"dark_mode\",\n  \"domain\": \"example.com\",\n  \"path\": \"/\",\n  \"expires\": 1735689600,\n  \"httpOnly\": false,\n  \"secure\": true,\n  \"sameSite\": \"Lax\"\n}\n\ndelete_cookies\n\nDelete cookies.\n\n{\"name\": \"session_id\"}\n\n\nOmit name to delete all cookies.\n\nget_local_storage\n\nGet localStorage item.\n\n{\"key\": \"user_data\"}\n\nset_local_storage\n\nSet localStorage item.\n\n{\"key\": \"theme\", \"value\": \"dark\"}\n\nclear_local_storage\n\nClear all localStorage.\n\n{}\n\nNetwork & Requests\nset_extra_headers\n\nSet extra HTTP headers for all requests.\n\n{\n  \"headers\": {\n    \"Authorization\": \"Bearer token123\",\n    \"X-Custom-Header\": \"value\"\n  }\n}\n\nblock_resources\n\nBlock specific resource types.\n\n{\"types\": [\"image\", \"stylesheet\", \"font\"]}\n\n\nTypes: document, stylesheet, image, media, font, script, xhr, fetch, other\n\nget_page_info\n\nGet comprehensive page information.\n\n{}\n\n\nReturns: title, url, html (optional), viewport size, etc.\n\niFrame Handling\nget_frame_text\n\nGet text from element inside iframe.\n\n{\n  \"frame_selector\": \"iframe#content\",\n  \"selector\": \"h1\"\n}\n\nclick_in_frame\n\nClick element inside iframe.\n\n{\n  \"frame_selector\": \"iframe#content\",\n  \"selector\": \"button\"\n}\n\nMulti-Page/Tab\nnew_page\n\nOpen a new page/tab.\n\n{\"url\": \"https://example.com\"}\n\nclose_page\n\nClose a specific page.\n\n{\"index\": 1}\n\nswitch_page\n\nSwitch to a different page.\n\n{\"index\": 0}\n\nlist_pages\n\nList all open pages.\n\n{}\n\nBrowser Context\nset_viewport\n\nSet viewport size.\n\n{\"width\": 1920, \"height\": 1080}\n\nemulate_device\n\nEmulate mobile device.\n\n{\"device\": \"iPhone 12\"}\n\n\nCommon devices: iPhone 12, iPad Pro, Galaxy S21, Pixel 5\n\nset_geolocation\n\nSet geolocation.\n\n{\n  \"latitude\": 37.7749,\n  \"longitude\": -122.4194,\n  \"accuracy\": 100\n}\n\nset_user_agent\n\nSet custom user agent.\n\n{\"user_agent\": \"Mozilla/5.0...\"}\n\nAdvanced Automation\ndrag_and_drop\n\nDrag element and drop on target.\n\n{\n  \"source\": \".draggable\",\n  \"target\": \".drop-zone\"\n}\n\nfill_form\n\nFill multiple form fields at once.\n\n{\n  \"fields\": {\n    \"input[name='email']\": \"user@example.com\",\n    \"input[name='password']\": \"secret123\",\n    \"select[name='country']\": \"US\"\n  }\n}\n\nextract_table\n\nExtract data from HTML table.\n\n{\n  \"selector\": \"table.data\",\n  \"headers\": true\n}\n\nextract_links\n\nExtract all links from page.\n\n{\n  \"selector\": \"a\",\n  \"filter\": \"^https://example\\\\.com\"\n}\n\nhandle_dialog\n\nSet how to handle JavaScript dialogs (alert/confirm/prompt).\n\n{\n  \"action\": \"accept\",\n  \"text\": \"Optional prompt response\"\n}\n\n\nActions: accept, dismiss\n\n💡 Usage Examples\nExample 1: Web Scraping\npython main.py get_multiple '{\n  \"url\": \"https://news.ycombinator.com\",\n  \"extractions\": [\n    {\"name\": \"titles\", \"selector\": \".titleline > a\", \"type\": \"text\", \"all\": true},\n    {\"name\": \"links\", \"selector\": \".titleline > a\", \"type\": \"attribute\", \"attribute\": \"href\", \"all\": true}\n  ]\n}'\n\nExample 2: Form Automation\npython main.py fill_form '{\n  \"url\": \"https://example.com/contact\",\n  \"fields\": {\n    \"input[name='name']\": \"John Doe\",\n    \"input[name='email']\": \"john@example.com\",\n    \"textarea[name='message']\": \"Hello!\"\n  }\n}'\n\nExample 3: Screenshot with Element Highlight\npython main.py screenshot '{\n  \"url\": \"https://example.com\",\n  \"selector\": \".hero-section\",\n  \"path\": \"hero.png\",\n  \"full_page\": false\n}'\n\nExample 4: PDF Generation\npython main.py pdf '{\n  \"url\": \"https://example.com/report\",\n  \"path\": \"report.pdf\",\n  \"format\": \"A4\",\n  \"margin\": {\"top\": \"2cm\", \"bottom\": \"2cm\"}\n}'\n\n🎯 OpenClaw Integration\n\nTo use this skill from OpenClaw, the agent can automatically invoke these actions. Examples:\n\nUser: \"Take a screenshot of example.com\"\nAgent: Executes screenshot action with the URL\n\nUser: \"What's the title of wikipedia.org?\"\nAgent: Navigates to Wikipedia and extracts text from the title element\n\nUser: \"Search for 'Python' on Google and get the first result link\"\nAgent: Navigates to Google, types in search, clicks search, extracts first result\n\n🔒 Security Notes\nBrowserless connection uses WebSocket over TLS (wss://)\nCredentials are never logged or exposed in responses\nAll browser actions are isolated in the Browserless container\nNo local browser installation required\n🐛 Troubleshooting\n\nConnection fails:\n\nVerify BROWSERLESS_WS URL is correct\nCheck if token is valid and not expired\nEnsure network allows WebSocket connections\n\nTimeout errors:\n\nIncrease timeout values for slow-loading pages\nUse wait_for_selector before interacting with dynamic content\nConsider using wait_until: \"networkidle\" for AJAX-heavy sites\n\nElement not found:\n\nVerify selector using browser DevTools\nWait for element to load with wait_for_selector\nCheck if element is inside an iframe\n📚 Resources\nPlaywright Documentation\nCSS Selectors Reference\nBrowserless Documentation"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/raff-lima/browserless-agent",
    "publisherUrl": "https://clawhub.ai/raff-lima/browserless-agent",
    "owner": "raff-lima",
    "version": "0.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/browserless-agent",
    "downloadUrl": "https://openagent3.xyz/downloads/browserless-agent",
    "agentUrl": "https://openagent3.xyz/skills/browserless-agent/agent",
    "manifestUrl": "https://openagent3.xyz/skills/browserless-agent/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/browserless-agent/agent.md"
  }
}