{
  "schemaVersion": "1.0",
  "item": {
    "slug": "browserwing",
    "name": "browserwing",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/chenhg5/browserwing",
    "canonicalUrl": "https://clawhub.ai/chenhg5/browserwing",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/browserwing",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=browserwing",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "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. 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. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "slug": "browserwing",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-11T17:58:53.619Z",
      "expiresAt": "2026-05-18T17:58:53.619Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=browserwing",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=browserwing",
        "contentDisposition": "attachment; filename=\"browserwing-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "browserwing"
      },
      "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/browserwing"
    },
    "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/browserwing",
    "agentPageUrl": "https://openagent3.xyz/skills/browserwing/agent",
    "manifestUrl": "https://openagent3.xyz/skills/browserwing/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/browserwing/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. 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. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Overview",
        "body": "BrowserWing Executor provides comprehensive browser automation capabilities through HTTP APIs. You can control browser navigation, interact with page elements, extract data, and analyze page structure."
      },
      {
        "title": "Configuration",
        "body": "API Base URL: The BrowserWing Executor API address is configurable via environment variable.\n\nEnvironment Variable: BROWSERWING_EXECUTOR_URL\nDefault Value: http://127.0.0.1:8080\nHow to get the URL: Read from environment variable $BROWSERWING_EXECUTOR_URL, if not set, use default http://127.0.0.1:8080\n\nBase URL Format: ${BROWSERWING_EXECUTOR_URL}/api/v1/executor or http://127.0.0.1:8080/api/v1/executor (if env var not set)\n\nAuthentication: Use X-BrowserWing-Key: <api-key> header or Authorization: Bearer <token> if required.\n\nImportant: Always construct the API URL by reading the environment variable first. In shell commands, use: ${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}"
      },
      {
        "title": "Core Capabilities",
        "body": "Page Navigation: Navigate to URLs, go back/forward, reload\nElement Interaction: Click, type, select, hover on page elements\nData Extraction: Extract text, attributes, values from elements\nAccessibility Analysis: Get accessibility snapshot to understand page structure\nAdvanced Operations: Screenshot, JavaScript execution, keyboard input\nBatch Processing: Execute multiple operations in sequence"
      },
      {
        "title": "1. Discover Available Commands",
        "body": "IMPORTANT: Always call this endpoint first to see all available commands and their parameters.\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/help\"\n\nResponse: Returns complete list of all commands with parameters, examples, and usage guidelines.\n\nQuery specific command:\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/help?command=extract\""
      },
      {
        "title": "2. Get Accessibility Snapshot",
        "body": "CRITICAL: Always call this after navigation to understand page structure and get element RefIDs.\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/snapshot\"\n\nResponse Example:\n\n{\n  \"success\": true,\n  \"snapshot_text\": \"Clickable Elements:\\n  @e1 Login (role: button)\\n  @e2 Sign Up (role: link)\\n\\nInput Elements:\\n  @e3 Email (role: textbox) [placeholder: your@email.com]\\n  @e4 Password (role: textbox)\"\n}\n\nUse Cases:\n\nUnderstand what interactive elements are on the page\nGet element RefIDs (@e1, @e2, etc.) for precise identification\nSee element labels, roles, and attributes\nThe accessibility tree is cleaner than raw DOM and better for LLMs\nRefIDs are stable references that work reliably across page changes"
      },
      {
        "title": "3. Common Operations",
        "body": "Note: All examples below use EXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\" to read the API address from environment variable, with http://127.0.0.1:8080 as fallback default.\n\nNavigate to URL\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/navigate\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"https://example.com\"}'\n\nClick Element\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/click\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e1\"}'\n\nIdentifier formats:\n\nRefID (Recommended): @e1, @e2 (from snapshot)\nCSS Selector: #button-id, .class-name\nXPath: //button[@type='submit']\nText: Login (text content)\n\nType Text\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/type\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e3\", \"text\": \"user@example.com\"}'\n\nExtract Data\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/extract\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"selector\": \".product-item\",\n    \"fields\": [\"text\", \"href\"],\n    \"multiple\": true\n  }'\n\nWait for Element\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/wait\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \".loading\", \"state\": \"hidden\", \"timeout\": 10}'\n\nBatch Operations\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/batch\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"operations\": [\n      {\"type\": \"navigate\", \"params\": {\"url\": \"https://example.com\"}, \"stop_on_error\": true},\n      {\"type\": \"click\", \"params\": {\"identifier\": \"@e1\"}, \"stop_on_error\": true},\n      {\"type\": \"type\", \"params\": {\"identifier\": \"@e3\", \"text\": \"query\"}, \"stop_on_error\": true}\n    ]\n  }'"
      },
      {
        "title": "Instructions",
        "body": "Step-by-step workflow:\n\nGet API URL: First, read the API base URL from environment variable $BROWSERWING_EXECUTOR_URL. If not set, use default http://127.0.0.1:8080. In shell commands, use: EXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\n\n\nDiscover commands: Call GET /help to see all available operations and their parameters (do this first if unsure).\n\n\nNavigate: Use POST /navigate to open the target webpage.\n\n\nAnalyze page: Call GET /snapshot to understand page structure and get element RefIDs.\n\n\nInteract: Use element RefIDs (like @e1, @e2) or CSS selectors to:\n\nClick elements: POST /click\nInput text: POST /type\nSelect options: POST /select\nWait for elements: POST /wait\n\n\n\nExtract data: Use POST /extract to get information from the page.\n\n\nPresent results: Format and show extracted data to the user."
      },
      {
        "title": "Complete Example",
        "body": "User Request: \"Search for 'laptop' on example.com and get the first 5 results\"\n\nYour Actions:\n\nNavigate to search page:\n\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/navigate' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"https://example.com/search\"}'\n\nGet page structure to find search input:\n\ncurl -X GET 'http://127.0.0.1:18085/api/v1/executor/snapshot'\n\nResponse shows: @e3 Search (role: textbox) [placeholder: Search...]\n\nType search query:\n\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/type' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e3\", \"text\": \"laptop\"}'\n\nPress Enter to submit:\n\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/press-key' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"key\": \"Enter\"}'\n\nWait for results to load:\n\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/wait' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \".search-results\", \"state\": \"visible\", \"timeout\": 10}'\n\nExtract search results:\n\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/extract' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"selector\": \".result-item\",\n    \"fields\": [\"text\", \"href\"],\n    \"multiple\": true\n  }'\n\nPresent the extracted data:\n\nFound 15 results for 'laptop':\n1. Gaming Laptop - $1299 (https://...)\n2. Business Laptop - $899 (https://...)\n..."
      },
      {
        "title": "Navigation",
        "body": "POST /navigate - Navigate to URL\nPOST /go-back - Go back in history\nPOST /go-forward - Go forward in history\nPOST /reload - Reload current page"
      },
      {
        "title": "Element Interaction",
        "body": "POST /click - Click element (supports: RefID @e1, CSS selector, XPath, text content)\nPOST /type - Type text into input (supports: RefID @e3, CSS selector, XPath)\nPOST /select - Select dropdown option\nPOST /hover - Hover over element\nPOST /wait - Wait for element state (visible, hidden, enabled)\nPOST /press-key - Press keyboard key (Enter, Tab, Ctrl+S, etc.)"
      },
      {
        "title": "Data Extraction",
        "body": "POST /extract - Extract data from elements (supports multiple elements, custom fields)\nPOST /get-text - Get element text content\nPOST /get-value - Get input element value\nGET /page-info - Get page URL and title\nGET /page-text - Get all page text\nGET /page-content - Get full HTML"
      },
      {
        "title": "Page Analysis",
        "body": "GET /snapshot - Get accessibility snapshot (⭐ ALWAYS call after navigation)\nGET /clickable-elements - Get all clickable elements\nGET /input-elements - Get all input elements"
      },
      {
        "title": "Advanced",
        "body": "POST /screenshot - Take page screenshot (base64 encoded)\nPOST /evaluate - Execute JavaScript code\nPOST /batch - Execute multiple operations in sequence\nPOST /scroll-to-bottom - Scroll to page bottom\nPOST /resize - Resize browser window\nPOST /tabs - Manage browser tabs (list, new, switch, close)\nPOST /fill-form - Intelligently fill multiple form fields at once"
      },
      {
        "title": "Debug & Monitoring",
        "body": "GET /console-messages - Get browser console messages (logs, warnings, errors)\nGET /network-requests - Get network requests made by the page\nPOST /handle-dialog - Configure JavaScript dialog (alert, confirm, prompt) handling\nPOST /file-upload - Upload files to input elements\nPOST /drag - Drag and drop elements\nPOST /close-page - Close the current page/tab"
      },
      {
        "title": "Element Identification",
        "body": "You can identify elements using:\n\nRefID (Recommended): @e1, @e2, @e3\n\nMost reliable method - stable across page changes\nGet RefIDs from /snapshot endpoint\nValid for 5 minutes after snapshot\nExample: \"identifier\": \"@e1\"\nWorks with multi-strategy fallback for robustness\n\n\n\nCSS Selector: #id, .class, button[type=\"submit\"]\n\nStandard CSS selectors\nExample: \"identifier\": \"#login-button\"\n\n\n\nXPath: //button[@id='login'], //a[contains(text(), 'Submit')]\n\nXPath expressions for complex queries\nExample: \"identifier\": \"//button[@id='login']\"\n\n\n\nText Content: Login, Sign Up, Submit\n\nSearches buttons and links with matching text\nExample: \"identifier\": \"Login\"\n\n\n\nARIA Label: Elements with aria-label attribute\n\nAutomatically searched"
      },
      {
        "title": "Guidelines",
        "body": "Before starting:\n\nGet API URL first: Read from $BROWSERWING_EXECUTOR_URL environment variable, or use http://127.0.0.1:8080 as default\nCall GET /help if you're unsure about available commands or their parameters\nEnsure browser is started (if not, it will auto-start on first operation)\n\nDuring automation:\n\nAlways call /snapshot after navigation to get page structure and RefIDs\nPrefer RefIDs (like @e1) over CSS selectors for reliability and stability\nRe-snapshot after page changes to get updated RefIDs\nUse /wait for dynamic content that loads asynchronously\nCheck element states before interaction (visible, enabled)\nUse /batch for multiple sequential operations to improve efficiency\n\nError handling:\n\nIf operation fails, check element identifier and try different format\nFor timeout errors, increase timeout value\nIf element not found, call /snapshot again to refresh page structure\nExplain errors clearly to user with suggested solutions\n\nData extraction:\n\nUse fields parameter to specify what to extract: [\"text\", \"href\", \"src\"]\nSet multiple: true to extract from multiple elements\nFormat extracted data in a readable way for user"
      },
      {
        "title": "Complete Workflow Example",
        "body": "Scenario: User wants to login to a website\n\nUser: \"Please log in to example.com with username 'john' and password 'secret123'\"\n\nYour Actions:\n\nStep 1: Navigate to login page\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/navigate\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"https://example.com/login\"}'\n\nStep 2: Get page structure\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/snapshot\"\n\nResponse:\n\nClickable Elements:\n  @e1 Login (role: button)\n\nInput Elements:\n  @e2 Username (role: textbox)\n  @e3 Password (role: textbox)\n\nStep 3: Enter username\n\nPOST http://127.0.0.1:18085/api/v1/executor/type\n{\"identifier\": \"@e2\", \"text\": \"john\"}\n\nStep 4: Enter password\n\nPOST http://127.0.0.1:18085/api/v1/executor/type\n{\"identifier\": \"@e3\", \"text\": \"secret123\"}\n\nStep 5: Click login button\n\nPOST http://127.0.0.1:18085/api/v1/executor/click\n{\"identifier\": \"@e1\"}\n\nStep 6: Wait for login success (optional)\n\nPOST http://127.0.0.1:18085/api/v1/executor/wait\n{\"identifier\": \".welcome-message\", \"state\": \"visible\", \"timeout\": 10}\n\nStep 7: Inform user\n\n\"Successfully logged in to example.com!\""
      },
      {
        "title": "Batch Operation Example",
        "body": "Scenario: Fill out a form with multiple fields\n\nInstead of making 5 separate API calls, use one batch operation:\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/batch\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"operations\": [\n      {\n        \"type\": \"navigate\",\n        \"params\": {\"url\": \"https://example.com/form\"},\n        \"stop_on_error\": true\n      },\n      {\n        \"type\": \"type\",\n        \"params\": {\"identifier\": \"#name\", \"text\": \"John Doe\"},\n        \"stop_on_error\": true\n      },\n      {\n        \"type\": \"type\",\n        \"params\": {\"identifier\": \"#email\", \"text\": \"john@example.com\"},\n        \"stop_on_error\": true\n      },\n      {\n        \"type\": \"select\",\n        \"params\": {\"identifier\": \"#country\", \"value\": \"United States\"},\n        \"stop_on_error\": true\n      },\n      {\n        \"type\": \"click\",\n        \"params\": {\"identifier\": \"#submit\"},\n        \"stop_on_error\": true\n      }\n    ]\n  }'"
      },
      {
        "title": "Best Practices",
        "body": "Discovery first: If unsure, call /help or /help?command=<name> to learn about commands\nStructure first: Always call /snapshot after navigation to understand the page\nUse accessibility indices: They're more reliable than CSS selectors (elements might have dynamic classes)\nWait for dynamic content: Use /wait before interacting with elements that load asynchronously\nBatch when possible: Use /batch for multiple sequential operations\nHandle errors gracefully: Provide clear explanations and suggestions when operations fail\nVerify results: After operations, check if desired outcome was achieved"
      },
      {
        "title": "Form Filling",
        "body": "Navigate to form page\nGet accessibility snapshot to find input elements and their RefIDs\nUse /type for each field: @e1, @e2, etc.\nUse /select for dropdowns\nClick submit button using its RefID"
      },
      {
        "title": "Data Scraping",
        "body": "Navigate to target page\nWait for content to load with /wait\nUse /extract with CSS selector and multiple: true\nSpecify fields to extract: [\"text\", \"href\", \"src\"]"
      },
      {
        "title": "Search Operations",
        "body": "Navigate to search page\nGet accessibility snapshot to locate search input\nType search query into input\nPress Enter or click search button\nWait for results\nExtract results data"
      },
      {
        "title": "Login Automation",
        "body": "Navigate to login page\nGet accessibility snapshot to find RefIDs\nType username: @e2\nType password: @e3\nClick login button: @e1\nWait for success indicator"
      },
      {
        "title": "Important Notes",
        "body": "Browser must be running (it will auto-start on first operation if needed)\nOperations are executed on the currently active browser tab\nAccessibility snapshot updates after each navigation and click operation\nAll timeouts are in seconds\nUse wait_visible: true (default) for reliable element interaction\nAPI address: Always read from $BROWSERWING_EXECUTOR_URL environment variable, fallback to http://127.0.0.1:8080 if not set\nAuthentication required: use X-BrowserWing-Key header or JWT token if configured"
      },
      {
        "title": "Troubleshooting",
        "body": "Element not found:\n\nCall /snapshot to see available elements\nTry different identifier format (accessibility index, CSS selector, text)\nCheck if page has finished loading\n\nTimeout errors:\n\nIncrease timeout value in request\nCheck if element actually appears on page\nUse /wait with appropriate state before interaction\n\nExtraction returns empty:\n\nVerify CSS selector matches target elements\nCheck if content has loaded (use /wait first)\nTry different extraction fields or type"
      },
      {
        "title": "Quick Reference",
        "body": "EXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\n\n# Discover commands\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/help\"\n\n# Navigate\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/navigate\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"...\"}'\n\n# Get page structure\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/snapshot\"\n\n# Click element\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/click\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e1\"}'\n\n# Type text\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/type\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e3\", \"text\": \"...\"}'\n\n# Extract data\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/extract\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"selector\": \"...\", \"fields\": [...], \"multiple\": true}'"
      },
      {
        "title": "Response Format",
        "body": "All operations return:\n\n{\n  \"success\": true,\n  \"message\": \"Operation description\",\n  \"timestamp\": \"2026-01-15T10:30:00Z\",\n  \"data\": {\n    // Operation-specific data\n  }\n}\n\nError response:\n\n{\n  \"error\": \"error.operationFailed\",\n  \"detail\": \"Detailed error message\"\n}"
      }
    ],
    "body": "BrowserWing Executor API\nOverview\n\nBrowserWing Executor provides comprehensive browser automation capabilities through HTTP APIs. You can control browser navigation, interact with page elements, extract data, and analyze page structure.\n\nConfiguration\n\nAPI Base URL: The BrowserWing Executor API address is configurable via environment variable.\n\nEnvironment Variable: BROWSERWING_EXECUTOR_URL\nDefault Value: http://127.0.0.1:8080\nHow to get the URL: Read from environment variable $BROWSERWING_EXECUTOR_URL, if not set, use default http://127.0.0.1:8080\n\nBase URL Format: ${BROWSERWING_EXECUTOR_URL}/api/v1/executor or http://127.0.0.1:8080/api/v1/executor (if env var not set)\n\nAuthentication: Use X-BrowserWing-Key: <api-key> header or Authorization: Bearer <token> if required.\n\nImportant: Always construct the API URL by reading the environment variable first. In shell commands, use: ${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\n\nCore Capabilities\nPage Navigation: Navigate to URLs, go back/forward, reload\nElement Interaction: Click, type, select, hover on page elements\nData Extraction: Extract text, attributes, values from elements\nAccessibility Analysis: Get accessibility snapshot to understand page structure\nAdvanced Operations: Screenshot, JavaScript execution, keyboard input\nBatch Processing: Execute multiple operations in sequence\nAPI Endpoints\n1. Discover Available Commands\n\nIMPORTANT: Always call this endpoint first to see all available commands and their parameters.\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/help\"\n\n\nResponse: Returns complete list of all commands with parameters, examples, and usage guidelines.\n\nQuery specific command:\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/help?command=extract\"\n\n2. Get Accessibility Snapshot\n\nCRITICAL: Always call this after navigation to understand page structure and get element RefIDs.\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/snapshot\"\n\n\nResponse Example:\n\n{\n  \"success\": true,\n  \"snapshot_text\": \"Clickable Elements:\\n  @e1 Login (role: button)\\n  @e2 Sign Up (role: link)\\n\\nInput Elements:\\n  @e3 Email (role: textbox) [placeholder: your@email.com]\\n  @e4 Password (role: textbox)\"\n}\n\n\nUse Cases:\n\nUnderstand what interactive elements are on the page\nGet element RefIDs (@e1, @e2, etc.) for precise identification\nSee element labels, roles, and attributes\nThe accessibility tree is cleaner than raw DOM and better for LLMs\nRefIDs are stable references that work reliably across page changes\n3. Common Operations\n\nNote: All examples below use EXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\" to read the API address from environment variable, with http://127.0.0.1:8080 as fallback default.\n\nNavigate to URL\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/navigate\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"https://example.com\"}'\n\nClick Element\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/click\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e1\"}'\n\n\nIdentifier formats:\n\nRefID (Recommended): @e1, @e2 (from snapshot)\nCSS Selector: #button-id, .class-name\nXPath: //button[@type='submit']\nText: Login (text content)\nType Text\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/type\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e3\", \"text\": \"user@example.com\"}'\n\nExtract Data\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/extract\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"selector\": \".product-item\",\n    \"fields\": [\"text\", \"href\"],\n    \"multiple\": true\n  }'\n\nWait for Element\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/wait\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \".loading\", \"state\": \"hidden\", \"timeout\": 10}'\n\nBatch Operations\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/batch\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"operations\": [\n      {\"type\": \"navigate\", \"params\": {\"url\": \"https://example.com\"}, \"stop_on_error\": true},\n      {\"type\": \"click\", \"params\": {\"identifier\": \"@e1\"}, \"stop_on_error\": true},\n      {\"type\": \"type\", \"params\": {\"identifier\": \"@e3\", \"text\": \"query\"}, \"stop_on_error\": true}\n    ]\n  }'\n\nInstructions\n\nStep-by-step workflow:\n\nGet API URL: First, read the API base URL from environment variable $BROWSERWING_EXECUTOR_URL. If not set, use default http://127.0.0.1:8080. In shell commands, use: EXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\n\nDiscover commands: Call GET /help to see all available operations and their parameters (do this first if unsure).\n\nNavigate: Use POST /navigate to open the target webpage.\n\nAnalyze page: Call GET /snapshot to understand page structure and get element RefIDs.\n\nInteract: Use element RefIDs (like @e1, @e2) or CSS selectors to:\n\nClick elements: POST /click\nInput text: POST /type\nSelect options: POST /select\nWait for elements: POST /wait\n\nExtract data: Use POST /extract to get information from the page.\n\nPresent results: Format and show extracted data to the user.\n\nComplete Example\n\nUser Request: \"Search for 'laptop' on example.com and get the first 5 results\"\n\nYour Actions:\n\nNavigate to search page:\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/navigate' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"https://example.com/search\"}'\n\nGet page structure to find search input:\ncurl -X GET 'http://127.0.0.1:18085/api/v1/executor/snapshot'\n\n\nResponse shows: @e3 Search (role: textbox) [placeholder: Search...]\n\nType search query:\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/type' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e3\", \"text\": \"laptop\"}'\n\nPress Enter to submit:\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/press-key' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"key\": \"Enter\"}'\n\nWait for results to load:\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/wait' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \".search-results\", \"state\": \"visible\", \"timeout\": 10}'\n\nExtract search results:\ncurl -X POST 'http://127.0.0.1:18085/api/v1/executor/extract' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"selector\": \".result-item\",\n    \"fields\": [\"text\", \"href\"],\n    \"multiple\": true\n  }'\n\nPresent the extracted data:\nFound 15 results for 'laptop':\n1. Gaming Laptop - $1299 (https://...)\n2. Business Laptop - $899 (https://...)\n...\n\nKey Commands Reference\nNavigation\nPOST /navigate - Navigate to URL\nPOST /go-back - Go back in history\nPOST /go-forward - Go forward in history\nPOST /reload - Reload current page\nElement Interaction\nPOST /click - Click element (supports: RefID @e1, CSS selector, XPath, text content)\nPOST /type - Type text into input (supports: RefID @e3, CSS selector, XPath)\nPOST /select - Select dropdown option\nPOST /hover - Hover over element\nPOST /wait - Wait for element state (visible, hidden, enabled)\nPOST /press-key - Press keyboard key (Enter, Tab, Ctrl+S, etc.)\nData Extraction\nPOST /extract - Extract data from elements (supports multiple elements, custom fields)\nPOST /get-text - Get element text content\nPOST /get-value - Get input element value\nGET /page-info - Get page URL and title\nGET /page-text - Get all page text\nGET /page-content - Get full HTML\nPage Analysis\nGET /snapshot - Get accessibility snapshot (⭐ ALWAYS call after navigation)\nGET /clickable-elements - Get all clickable elements\nGET /input-elements - Get all input elements\nAdvanced\nPOST /screenshot - Take page screenshot (base64 encoded)\nPOST /evaluate - Execute JavaScript code\nPOST /batch - Execute multiple operations in sequence\nPOST /scroll-to-bottom - Scroll to page bottom\nPOST /resize - Resize browser window\nPOST /tabs - Manage browser tabs (list, new, switch, close)\nPOST /fill-form - Intelligently fill multiple form fields at once\nDebug & Monitoring\nGET /console-messages - Get browser console messages (logs, warnings, errors)\nGET /network-requests - Get network requests made by the page\nPOST /handle-dialog - Configure JavaScript dialog (alert, confirm, prompt) handling\nPOST /file-upload - Upload files to input elements\nPOST /drag - Drag and drop elements\nPOST /close-page - Close the current page/tab\nElement Identification\n\nYou can identify elements using:\n\nRefID (Recommended): @e1, @e2, @e3\n\nMost reliable method - stable across page changes\nGet RefIDs from /snapshot endpoint\nValid for 5 minutes after snapshot\nExample: \"identifier\": \"@e1\"\nWorks with multi-strategy fallback for robustness\n\nCSS Selector: #id, .class, button[type=\"submit\"]\n\nStandard CSS selectors\nExample: \"identifier\": \"#login-button\"\n\nXPath: //button[@id='login'], //a[contains(text(), 'Submit')]\n\nXPath expressions for complex queries\nExample: \"identifier\": \"//button[@id='login']\"\n\nText Content: Login, Sign Up, Submit\n\nSearches buttons and links with matching text\nExample: \"identifier\": \"Login\"\n\nARIA Label: Elements with aria-label attribute\n\nAutomatically searched\nGuidelines\n\nBefore starting:\n\nGet API URL first: Read from $BROWSERWING_EXECUTOR_URL environment variable, or use http://127.0.0.1:8080 as default\nCall GET /help if you're unsure about available commands or their parameters\nEnsure browser is started (if not, it will auto-start on first operation)\n\nDuring automation:\n\nAlways call /snapshot after navigation to get page structure and RefIDs\nPrefer RefIDs (like @e1) over CSS selectors for reliability and stability\nRe-snapshot after page changes to get updated RefIDs\nUse /wait for dynamic content that loads asynchronously\nCheck element states before interaction (visible, enabled)\nUse /batch for multiple sequential operations to improve efficiency\n\nError handling:\n\nIf operation fails, check element identifier and try different format\nFor timeout errors, increase timeout value\nIf element not found, call /snapshot again to refresh page structure\nExplain errors clearly to user with suggested solutions\n\nData extraction:\n\nUse fields parameter to specify what to extract: [\"text\", \"href\", \"src\"]\nSet multiple: true to extract from multiple elements\nFormat extracted data in a readable way for user\nComplete Workflow Example\n\nScenario: User wants to login to a website\n\nUser: \"Please log in to example.com with username 'john' and password 'secret123'\"\n\n\nYour Actions:\n\nStep 1: Navigate to login page\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/navigate\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"https://example.com/login\"}'\n\n\nStep 2: Get page structure\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/snapshot\"\n\n\nResponse:\n\nClickable Elements:\n  @e1 Login (role: button)\n\nInput Elements:\n  @e2 Username (role: textbox)\n  @e3 Password (role: textbox)\n\n\nStep 3: Enter username\n\nPOST http://127.0.0.1:18085/api/v1/executor/type\n{\"identifier\": \"@e2\", \"text\": \"john\"}\n\n\nStep 4: Enter password\n\nPOST http://127.0.0.1:18085/api/v1/executor/type\n{\"identifier\": \"@e3\", \"text\": \"secret123\"}\n\n\nStep 5: Click login button\n\nPOST http://127.0.0.1:18085/api/v1/executor/click\n{\"identifier\": \"@e1\"}\n\n\nStep 6: Wait for login success (optional)\n\nPOST http://127.0.0.1:18085/api/v1/executor/wait\n{\"identifier\": \".welcome-message\", \"state\": \"visible\", \"timeout\": 10}\n\n\nStep 7: Inform user\n\n\"Successfully logged in to example.com!\"\n\nBatch Operation Example\n\nScenario: Fill out a form with multiple fields\n\nInstead of making 5 separate API calls, use one batch operation:\n\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/batch\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"operations\": [\n      {\n        \"type\": \"navigate\",\n        \"params\": {\"url\": \"https://example.com/form\"},\n        \"stop_on_error\": true\n      },\n      {\n        \"type\": \"type\",\n        \"params\": {\"identifier\": \"#name\", \"text\": \"John Doe\"},\n        \"stop_on_error\": true\n      },\n      {\n        \"type\": \"type\",\n        \"params\": {\"identifier\": \"#email\", \"text\": \"john@example.com\"},\n        \"stop_on_error\": true\n      },\n      {\n        \"type\": \"select\",\n        \"params\": {\"identifier\": \"#country\", \"value\": \"United States\"},\n        \"stop_on_error\": true\n      },\n      {\n        \"type\": \"click\",\n        \"params\": {\"identifier\": \"#submit\"},\n        \"stop_on_error\": true\n      }\n    ]\n  }'\n\nBest Practices\nDiscovery first: If unsure, call /help or /help?command=<name> to learn about commands\nStructure first: Always call /snapshot after navigation to understand the page\nUse accessibility indices: They're more reliable than CSS selectors (elements might have dynamic classes)\nWait for dynamic content: Use /wait before interacting with elements that load asynchronously\nBatch when possible: Use /batch for multiple sequential operations\nHandle errors gracefully: Provide clear explanations and suggestions when operations fail\nVerify results: After operations, check if desired outcome was achieved\nCommon Scenarios\nForm Filling\nNavigate to form page\nGet accessibility snapshot to find input elements and their RefIDs\nUse /type for each field: @e1, @e2, etc.\nUse /select for dropdowns\nClick submit button using its RefID\nData Scraping\nNavigate to target page\nWait for content to load with /wait\nUse /extract with CSS selector and multiple: true\nSpecify fields to extract: [\"text\", \"href\", \"src\"]\nSearch Operations\nNavigate to search page\nGet accessibility snapshot to locate search input\nType search query into input\nPress Enter or click search button\nWait for results\nExtract results data\nLogin Automation\nNavigate to login page\nGet accessibility snapshot to find RefIDs\nType username: @e2\nType password: @e3\nClick login button: @e1\nWait for success indicator\nImportant Notes\nBrowser must be running (it will auto-start on first operation if needed)\nOperations are executed on the currently active browser tab\nAccessibility snapshot updates after each navigation and click operation\nAll timeouts are in seconds\nUse wait_visible: true (default) for reliable element interaction\nAPI address: Always read from $BROWSERWING_EXECUTOR_URL environment variable, fallback to http://127.0.0.1:8080 if not set\nAuthentication required: use X-BrowserWing-Key header or JWT token if configured\nTroubleshooting\n\nElement not found:\n\nCall /snapshot to see available elements\nTry different identifier format (accessibility index, CSS selector, text)\nCheck if page has finished loading\n\nTimeout errors:\n\nIncrease timeout value in request\nCheck if element actually appears on page\nUse /wait with appropriate state before interaction\n\nExtraction returns empty:\n\nVerify CSS selector matches target elements\nCheck if content has loaded (use /wait first)\nTry different extraction fields or type\nQuick Reference\nEXECUTOR_URL=\"${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}\"\n\n# Discover commands\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/help\"\n\n# Navigate\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/navigate\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"...\"}'\n\n# Get page structure\ncurl -X GET \"${EXECUTOR_URL}/api/v1/executor/snapshot\"\n\n# Click element\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/click\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e1\"}'\n\n# Type text\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/type\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"identifier\": \"@e3\", \"text\": \"...\"}'\n\n# Extract data\ncurl -X POST \"${EXECUTOR_URL}/api/v1/executor/extract\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"selector\": \"...\", \"fields\": [...], \"multiple\": true}'\n\nResponse Format\n\nAll operations return:\n\n{\n  \"success\": true,\n  \"message\": \"Operation description\",\n  \"timestamp\": \"2026-01-15T10:30:00Z\",\n  \"data\": {\n    // Operation-specific data\n  }\n}\n\n\nError response:\n\n{\n  \"error\": \"error.operationFailed\",\n  \"detail\": \"Detailed error message\"\n}"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/chenhg5/browserwing",
    "publisherUrl": "https://clawhub.ai/chenhg5/browserwing",
    "owner": "chenhg5",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/browserwing",
    "downloadUrl": "https://openagent3.xyz/downloads/browserwing",
    "agentUrl": "https://openagent3.xyz/skills/browserwing/agent",
    "manifestUrl": "https://openagent3.xyz/skills/browserwing/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/browserwing/agent.md"
  }
}