[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M698TCERM0YWY3HZY2Q5V0EY":3,"skill-same:01M698TCERM0YWY3HZY2Q5V0EY":74},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":50,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M698TCERM0YWY3HZY2Q5V0EY","browser-automation",null,"Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs\u002Ftimeouts.","openclaw\u002Fopenclaw","openclaw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F252820863?v=4","01M698P3FSAZ6B4R928ZF19KPT","01M698PDMDRVH56MV30D253NFP",394352,"MIT","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Fbrowser\u002Fskills\u002Fbrowser-automation\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,9,27,28,29,30,31,32,33,34,35,36,37,38,39],"browser automation","automation","browser","tab management","when","login","with","flows","multi","false","pages","stale","use","management","tool","recovery","web","2026-11-10 10:12:30",false,"---\nname: browser-automation\ndescription: Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs\u002Ftimeouts.\nuser-invocable: false\n---\n\n# Browser Automation\n\nUse this skill when you need the `browser` tool for anything beyond a single page check.\n\n## Operating Loop\n\n1. Check browser state before acting:\n   - `openclaw browser doctor` or `action=\"status\"` when the browser\u002Fplugin setup itself may be broken.\n   - `action=\"status\"` for availability.\n   - `action=\"profiles\"` if login state or profile choice matters.\n   - `action=\"tabs\"` before opening a new tab if retries\u002Ftimeouts may have left windows behind.\n2. Prefer stable tab handles:\n   - Open important tabs with `label`, for example `label=\"meet\"`.\n   - After `action=\"tabs\"` or `action=\"open\"`, store `suggestedTargetId` and pass it as `targetId` in later calls.\n   - `suggestedTargetId` is the label when one exists, otherwise the stable `tabId` handle like `t1`.\n   - Avoid relying on raw DevTools `targetId` except for immediate diagnostics; it can change under Chromium target replacement.\n3. Read before you click:\n   - For “read the page and answer X,” use `action=\"text\"` with optional `selector` and `maxChars` for bounded visible prose (first selector match, otherwise article\u002Fmain\u002Fbody). On existing-session profiles, use `snapshot` instead. Efficient snapshots omit most prose.\n   - For virtualized lists, scroll through each segment, capture only the relevant rows, then merge the results.\n   - Use `action=\"snapshot\"` on the intended `targetId`.\n   - Add snapshot `query` to find lines containing all query tokens, ignoring case; matching lines keep their refs.\n   - Use the same `targetId` for follow-up actions so refs stay on the same tab.\n   - For durable Playwright refs, request `refs=\"aria\"` when supported. If you receive `axN` refs from `snapshotFormat=\"aria\"`, use them only after that same snapshot call; stale or unbound `axN` refs fail fast and need a fresh snapshot.\n   - Use `urls=true` when link text is ambiguous or a direct navigation target would avoid brittle clicks.\n   - Use `labels=true` on snapshot or screenshot when visual position matters. On Playwright-backed profiles, the response includes an `annotations` array (`{ref, number, role, name?, box}`) with each ref's bounding box in the captured image's coordinate space, so you can reason about position without re-snapshotting; screenshot labels can also combine with `fullPage=true` (CLI: `--full-page`) to label the whole document, or `ref` \u002F `element` to clip to one element. `profile=\"user\"` and other existing-session (chrome-mcp) profiles render an overlay into page screenshots but do not attach `annotations` or use the Playwright full-page\u002Fref\u002Felement projection helper, so read positions from the labeled image itself on those profiles. The raw-CDP fallback (no Playwright) does not support labeled screenshots at all and returns a 501, so only request `labels` when Playwright is available.\n4. Act narrowly:\n   - Prefer `action=\"act\"` with a ref from the latest snapshot.\n   - `navigate` returns the loaded page's compact snapshot inline, and batch `act` results that report a cross-document navigation include fresh page state; use those refs directly instead of a follow-up snapshot call.\n   - After a single act that triggers navigation, and after modal changes or form submissions, snapshot again before the next action.\n   - Avoid blind waits. Wait for visible UI state when possible.\n   - Use `action=\"emulate\"` with `device`, `colorScheme`, `timezoneId`, or `locale` when testing those settings; snapshot again afterward. Existing-session profiles do not support emulation.\n5. Report real blockers:\n   - Debug network failures with `action=\"requests\"`, optional URL\u002Ftype `filter`, and `limit` (default 50 recent entries). `clear=true` clears the collected log after reading. Use a managed profile; existing-session profiles do not support this log.\n   - Debug page errors with `action=\"errors\"` and `limit` (default 50 recent entries). `clear=true` clears the collected log after reading. Existing-session profiles do not support this log.\n   - If the page needs login, permission, captcha, 2FA, camera\u002Fmicrophone approval, or another manual step, stop and tell the user exactly what is needed.\n   - Do not claim the browser is not logged in just because the current page shows a permission or onboarding dialog. Inspect the visible UI first.\n\n## Browser batch CLI\n\n`openclaw browser batch` runs an array of nested `\u002Fact` actions in one `\u002Fact` call (the same `kind=\"batch\"` runtime reached through the agent tool), so CLI users and scripts can combine actions like `wait`, `click`, `type`, and `evaluate` into a single replayable plan without per-action round trips. Each entry in `actions[]` is a `BrowserActRequest` — the closed union the `\u002Fact` route accepts — not arbitrary `openclaw browser` subcommands. `batch` is not supported on `profile=\"user\"` and other existing-session (chrome-mcp) profiles; send actions individually there.\n\n- CLI: `openclaw browser batch --actions '\u003Cjson>'`, `--actions-file plan.json`, or `--actions-file -` for stdin. `--actions-file` and stdin input are capped at 1,000,000 bytes; split larger plans into multiple batch commands. `--continue` sets `stopOnError=false`; default stops on first error.\n- Ref lifecycle: refs come from a `snapshot` run before the batch (snapshot is not a nested action). A nested action that changes page state — such as a `click` that triggers navigation, or an `evaluate` that mutates the DOM — can invalidate earlier refs for the rest of the batch; put state-changing actions first, or split into a follow-up batch after re-snapshotting. Navigation and re-snapshotting happen outside the batch, since `open`, `navigate`, and `snapshot` are not `\u002Fact` kinds.\n- Target id: nested actions share the request's tab; an explicit nested `targetId` that resolves to a different tab is rejected with `ACT_TARGET_ID_MISMATCH`.\n- Response: `{ \"results\": [{ \"ok\": true } | { \"ok\": false, \"error\": \"...\" }, ...] }` in order; with default `stopOnError` the array ends at the first failure. Any failed entry exits nonzero; use `--json` to preserve the full response in scripts.\n\n## Code Mode Loop\n\nFor explicit page-blocker triage with a configured Decision model, read\n[Page triage](references\u002Fpage-triage.md). Browser `action=\"judge\"` classifies a\nbounded observation through the selected Decision provider and returns answers,\nnot page text, to the primary model. It works on text-capable Chromium and\nLightpanda profiles; it is not Lightpanda native `judge()`.\n\nWhen `tools.codeMode` is enabled, the Browser tool has no normal turn — it is cataloged behind `exec`\u002F`wait`. Call it from exec cells as an async global, using the callable name the exec quick index advertises for the Browser tool (normally `browser`; colliding names get suffixed, and a client tool can win an identical name). An exact `catalog.search(\"browser\")` returns a handle already bound to the effective callable name, so resolve the handle in each cell and call it instead of hard-coding the literal global; an empty result means the Browser tool is not cataloged in this run.\n\nKeep the same labeled tab through the loop, and alternate reads with actions. Each `exec` cell starts a fresh VM — bindings from a completed cell are gone in the next, and only runs left `waiting` keep their state until `wait` resumes them — so carry comparison state across cells by returning it and re-embedding the returned values in the next cell:\n\n```javascript\n\u002F\u002F previous = the url\u002FnewElements returned by the last completed cell (a fresh\n\u002F\u002F VM runs this cell, so prior bindings do not exist here).\nconst previous = { url: \"https:\u002F\u002Fexample.com\u002Finbox\", newElements: 0 };\nconst [browser] = await catalog.search(\"browser\", { limit: 1 });\nconst details = await browser({\n  action: \"snapshot\",\n  snapshotFormat: \"ai\",\n  targetId: \"task\",\n  refs: \"aria\",\n  interactive: true,\n});\nconst changed =\n  details?.url !== previous.url ||\n  (details?.newElements ?? 0) > 0 ||\n  details?.blockedByDialog === true;\nreturn {\n  targetId: details?.targetId,\n  url: details?.url,\n  newElements: details?.newElements,\n  stats: details?.stats,\n  text: details?.text,\n  changed,\n};\n```\n\n- Code-mode calls return the tool's structured `details` directly. Snapshot and text observations include bounded `text` with the same untrusted-content wrapper as direct tool output. Keep that wrapper when returning page data to the model. Existing identity, `stats`, and dialog fields remain available.\n- To read visible prose inside code mode, request `text` with a narrow selector. It does not require the evaluate capability:\n\n```javascript\nconst [browser] = await catalog.search(\"browser\", { limit: 1 });\nconst read = await browser({\n  action: \"text\",\n  selector: \"main\",\n  maxChars: 2000,\n  targetId: \"task\",\n});\nreturn { url: read?.url, text: read?.text };\n```\n\nUse snapshot `query` and text `selector`\u002F`maxChars` to narrow reads at the Browser owner before wrapping. A blocked dialog still needs its reported recovery step; page text does not grant permission to evaluate scripts.\n\n- Return only the fields the next step needs; never return the whole details object.\n- Completed cells share no state: re-embed the previous cell's returned `url`\u002F`newElements` in the next cell, or keep the comparison inside one cell. Only `waiting` runs persist, resumed by `wait`.\n- Interleave each act with a URL or tabs check before the next dependent act.\n- If a batch returns `aborted`, take a fresh snapshot before continuing.\n- If `newElements` is positive, inspect those elements first, then update the re-embedded state.\n- Use separate act calls when navigation is expected between steps.\n\n## Tab Hygiene\n\nBefore creating a tab for a named task, list tabs and reuse an existing matching label or URL when it is still usable.\n\nExample:\n\n```json\n{ \"action\": \"tabs\" }\n```\n\nIf no suitable tab exists:\n\n```json\n{ \"action\": \"open\", \"url\": \"https:\u002F\u002Fexample.com\", \"label\": \"task\" }\n```\n\nThen target it by label:\n\n```json\n{ \"action\": \"snapshot\", \"targetId\": \"task\", \"refs\": \"aria\" }\n```\n\nIf a retry creates duplicates, close the extras by `tabId`:\n\n```json\n{ \"action\": \"close\", \"targetId\": \"t3\" }\n```\n\nDo not pass bare numbers like `\"2\"` as `targetId`. Numeric tab positions are only for the CLI `openclaw browser tab select 2` helper; browser tool calls need a `suggestedTargetId`, label, `tabId`, or raw target id.\n\n## Stale Ref Recovery\n\nIf an action fails with a missing or stale ref:\n\n1. Snapshot the same `targetId` again.\n2. Find the current visible control.\n3. Retry once with the new ref.\n4. If the UI moved to a blocker state, report the blocker instead of looping.\n\n## Existing User Browser\n\nUse `profile=\"user\"` only when existing cookies\u002Flogin matter. This attaches to the user's running Chromium-based browser.\n\nOn macOS, `action=\"importprofile\"` is the alternative when the agent should use an isolated managed browser with cookies copied from a real Chrome-family profile. First use `action=\"profiles\"` and inspect `systemProfiles`, then import into a fresh managed profile name. Import asks for one Keychain\u002FTouch ID consent prompt. It copies cookies, not local storage or IndexedDB; device-bound session credentials (DBSC) mean some Google sessions may still require re-authentication.\n\nFor `profile=\"user\"` and other existing-session profiles, omit `timeoutMs` on `act:type`, `hover`, `scrollIntoView`, `drag`, `select`, and `fill`; that driver rejects per-call timeout overrides for those actions. `act:evaluate` accepts `timeoutMs`.\n\n## Google Meet Notes\n\nWhen creating or joining a Meet:\n\n- Treat camera\u002Fmicrophone permission screens as progress, not login failure.\n- If asked whether people can hear you, click the microphone option when voice is required.\n- If Google asks for sign-in, 2FA, account chooser confirmation, or permission that needs user approval, report the exact manual action.\n- Use one labeled tab per meeting flow, for example `label=\"meet\"`, and reuse it during retries.\n","# Browser Automation\n\nUse this skill when you need the `browser` tool for anything beyond a single page check.\n\n## Operating Loop\n\n1. Check browser state before acting:\n   - `openclaw browser doctor` or `action=\"status\"` when the browser\u002Fplugin setup itself may be broken.\n   - `action=\"status\"` for availability.\n   - `action=\"profiles\"` if login state or profile choice matters.\n   - `action=\"tabs\"` before opening a new tab if retries\u002Ftimeouts may have left windows behind.\n2. Prefer stable tab handles:\n   - Open important tabs with `label`, for example `label=\"meet\"`.\n   - After `action=\"tabs\"` or `action=\"open\"`, store `suggestedTargetId` and pass it as `targetId` in later calls.\n   - `suggestedTargetId` is the label when one exists, otherwise the stable `tabId` handle like `t1`.\n   - Avoid relying on raw DevTools `targetId` except for immediate diagnostics; it can change under Chromium target replacement.\n3. Read before you click:\n   - For “read the page and answer X,” use `action=\"text\"` with optional `selector` and `maxChars` for bounded visible prose (first selector match, otherwise article\u002Fmain\u002Fbody). On existing-session profiles, use `snapshot` instead. Efficient snapshots omit most prose.\n   - For virtualized lists, scroll through each segment, capture only the relevant rows, then merge the results.\n   - Use `action=\"snapshot\"` on the intended `targetId`.\n   - Add snapshot `query` to find lines containing all query tokens, ignoring case; matching lines keep their refs.\n   - Use the same `targetId` for follow-up actions so refs stay on the same tab.\n   - For durable Playwright refs, request `refs=\"aria\"` when supported. If you receive `axN` refs from `snapshotFormat=\"aria\"`, use them only after that same snapshot call; stale or unbound `axN` refs fail fast and need a fresh snapshot.\n   - Use `urls=true` when link text is ambiguous or a direct navigation target would avoid brittle clicks.\n   - Use `labels=true` on snapshot or screenshot when visual position matters. On Playwright-backed profiles, the response includes an `annotations` array (`{ref, number, role, name?, box}`) with each ref's bounding box in the captured image's coordinate space, so you can reason about position without re-snapshotting; screenshot labels can also combine with `fullPage=true` (CLI: `--full-page`) to label the whole document, or `ref` \u002F `element` to clip to one element. `profile=\"user\"` and other existing-session (chrome-mcp) profiles render an overlay into page screenshots but do not attach `annotations` or use the Playwright full-page\u002Fref\u002Felement projection helper, so read positions from the labeled image itself on those profiles. The raw-CDP fallback (no Playwright) does not support labeled screenshots at all and returns a 501, so only request `labels` when Playwright is available.\n4. Act narrowly:\n   - Prefer `action=\"act\"` with a ref from the latest snapshot.\n   - `navigate` returns the loaded page's compact snapshot inline, and batch `act` results that report a cross-document navigation include fresh page state; use those refs directly instead of a follow-up snapshot call.\n   - After a single act that triggers navigation, and after modal changes or form submissions, snapshot again before the next action.\n   - Avoid blind waits. Wait for visible UI state when possible.\n   - Use `action=\"emulate\"` with `device`, `colorScheme`, `timezoneId`, or `locale` when testing those settings; snapshot again afterward. Existing-session profiles do not support emulation.\n5. Report real blockers:\n   - Debug network failures with `action=\"requests\"`, optional URL\u002Ftype `filter`, and `limit` (default 50 recent entries). `clear=true` clears the collected log after reading. Use a managed profile; existing-session profiles do not support this log.\n   - Debug page errors with `action=\"errors\"` and `limit` (default 50 recent entries). `clear=true` clears the collected log after reading. Existing-session profiles do not support this log.\n   - If the page needs login, permission, captcha, 2FA, camera\u002Fmicrophone approval, or another manual step, stop and tell the user exactly what is needed.\n   - Do not claim the browser is not logged in just because the current page shows a permission or onboarding dialog. Inspect the visible UI first.\n\n## Browser batch CLI\n\n`openclaw browser batch` runs an array of nested `\u002Fact` actions in one `\u002Fact` call (the same `kind=\"batch\"` runtime reached through the agent tool), so CLI users and scripts can combine actions like `wait`, `click`, `type`, and `evaluate` into a single replayable plan without per-action round trips. Each entry in `actions[]` is a `BrowserActRequest` — the closed union the `\u002Fact` route accepts — not arbitrary `openclaw browser` subcommands. `batch` is not supported on `profile=\"user\"` and other existing-session (chrome-mcp) profiles; send actions individually there.\n\n- CLI: `openclaw browser batch --actions '\u003Cjson>'`, `--actions-file plan.json`, or `--actions-file -` for stdin. `--actions-file` and stdin input are capped at 1,000,000 bytes; split larger plans into multiple batch commands. `--continue` sets `stopOnError=false`; default stops on first error.\n- Ref lifecycle: refs come from a `snapshot` run before the batch (snapshot is not a nested action). A nested action that changes page state — such as a `click` that triggers navigation, or an `evaluate` that mutates the DOM — can invalidate earlier refs for the rest of the batch; put state-changing actions first, or split into a follow-up batch after re-snapshotting. Navigation and re-snapshotting happen outside the batch, since `open`, `navigate`, and `snapshot` are not `\u002Fact` kinds.\n- Target id: nested actions share the request's tab; an explicit nested `targetId` that resolves to a different tab is rejected with `ACT_TARGET_ID_MISMATCH`.\n- Response: `{ \"results\": [{ \"ok\": true } | { \"ok\": false, \"error\": \"...\" }, ...] }` in order; with default `stopOnError` the array ends at the first failure. Any failed entry exits nonzero; use `--json` to preserve the full response in scripts.\n\n## Code Mode Loop\n\nFor explicit page-blocker triage with a configured Decision model, read\n[Page triage](references\u002Fpage-triage.md). Browser `action=\"judge\"` classifies a\nbounded observation through the selected Decision provider and returns answers,\nnot page text, to the primary model. It works on text-capable Chromium and\nLightpanda profiles; it is not Lightpanda native `judge()`.\n\nWhen `tools.codeMode` is enabled, the Browser tool has no normal turn — it is cataloged behind `exec`\u002F`wait`. Call it from exec cells as an async global, using the callable name the exec quick index advertises for the Browser tool (normally `browser`; colliding names get suffixed, and a client tool can win an identical name). An exact `catalog.search(\"browser\")` returns a handle already bound to the effective callable name, so resolve the handle in each cell and call it instead of hard-coding the literal global; an empty result means the Browser tool is not cataloged in this run.\n\nKeep the same labeled tab through the loop, and alternate reads with actions. Each `exec` cell starts a fresh VM — bindings from a completed cell are gone in the next, and only runs left `waiting` keep their state until `wait` resumes them — so carry comparison state across cells by returning it and re-embedding the returned values in the next cell:\n\n```javascript\n\u002F\u002F previous = the url\u002FnewElements returned by the last completed cell (a fresh\n\u002F\u002F VM runs this cell, so prior bindings do not exist here).\nconst previous = { url: \"https:\u002F\u002Fexample.com\u002Finbox\", newElements: 0 };\nconst [browser] = await catalog.search(\"browser\", { limit: 1 });\nconst details = await browser({\n  action: \"snapshot\",\n  snapshotFormat: \"ai\",\n  targetId: \"task\",\n  refs: \"aria\",\n  interactive: true,\n});\nconst changed =\n  details?.url !== previous.url ||\n  (details?.newElements ?? 0) > 0 ||\n  details?.blockedByDialog === true;\nreturn {\n  targetId: details?.targetId,\n  url: details?.url,\n  newElements: details?.newElements,\n  stats: details?.stats,\n  text: details?.text,\n  changed,\n};\n```\n\n- Code-mode calls return the tool's structured `details` directly. Snapshot and text observations include bounded `text` with the same untrusted-content wrapper as direct tool output. Keep that wrapper when returning page data to the model. Existing identity, `stats`, and dialog fields remain available.\n- To read visible prose inside code mode, request `text` with a narrow selector. It does not require the evaluate capability:\n\n```javascript\nconst [browser] = await catalog.search(\"browser\", { limit: 1 });\nconst read = await browser({\n  action: \"text\",\n  selector: \"main\",\n  maxChars: 2000,\n  targetId: \"task\",\n});\nreturn { url: read?.url, text: read?.text };\n```\n\nUse snapshot `query` and text `selector`\u002F`maxChars` to narrow reads at the Browser owner before wrapping. A blocked dialog still needs its reported recovery step; page text does not grant permission to evaluate scripts.\n\n- Return only the fields the next step needs; never return the whole details object.\n- Completed cells share no state: re-embed the previous cell's returned `url`\u002F`newElements` in the next cell, or keep the comparison inside one cell. Only `waiting` runs persist, resumed by `wait`.\n- Interleave each act with a URL or tabs check before the next dependent act.\n- If a batch returns `aborted`, take a fresh snapshot before continuing.\n- If `newElements` is positive, inspect those elements first, then update the re-embedded state.\n- Use separate act calls when navigation is expected between steps.\n\n## Tab Hygiene\n\nBefore creating a tab for a named task, list tabs and reuse an existing matching label or URL when it is still usable.\n\nExample:\n\n```json\n{ \"action\": \"tabs\" }\n```\n\nIf no suitable tab exists:\n\n```json\n{ \"action\": \"open\", \"url\": \"https:\u002F\u002Fexample.com\", \"label\": \"task\" }\n```\n\nThen target it by label:\n\n```json\n{ \"action\": \"snapshot\", \"targetId\": \"task\", \"refs\": \"aria\" }\n```\n\nIf a retry creates duplicates, close the extras by `tabId`:\n\n```json\n{ \"action\": \"close\", \"targetId\": \"t3\" }\n```\n\nDo not pass bare numbers like `\"2\"` as `targetId`. Numeric tab positions are only for the CLI `openclaw browser tab select 2` helper; browser tool calls need a `suggestedTargetId`, label, `tabId`, or raw target id.\n\n## Stale Ref Recovery\n\nIf an action fails with a missing or stale ref:\n\n1. Snapshot the same `targetId` again.\n2. Find the current visible control.\n3. Retry once with the new ref.\n4. If the UI moved to a blocker state, report the blocker instead of looping.\n\n## Existing User Browser\n\nUse `profile=\"user\"` only when existing cookies\u002Flogin matter. This attaches to the user's running Chromium-based browser.\n\nOn macOS, `action=\"importprofile\"` is the alternative when the agent should use an isolated managed browser with cookies copied from a real Chrome-family profile. First use `action=\"profiles\"` and inspect `systemProfiles`, then import into a fresh managed profile name. Import asks for one Keychain\u002FTouch ID consent prompt. It copies cookies, not local storage or IndexedDB; device-bound session credentials (DBSC) mean some Google sessions may still require re-authentication.\n\nFor `profile=\"user\"` and other existing-session profiles, omit `timeoutMs` on `act:type`, `hover`, `scrollIntoView`, `drag`, `select`, and `fill`; that driver rejects per-call timeout overrides for those actions. `act:evaluate` accepts `timeoutMs`.\n\n## Google Meet Notes\n\nWhen creating or joining a Meet:\n\n- Treat camera\u002Fmicrophone permission screens as progress, not login failure.\n- If asked whether people can hear you, click the microphone option when voice is required.\n- If Google asks for sign-in, 2FA, account chooser confirmation, or permission that needs user approval, report the exact manual action.\n- Use one labeled tab per meeting flow, for example `label=\"meet\"`, and reuse it during retries.\n",{"name":5,"description":7,"user-invocable":41},"main","f1c93577085244aa96aa87b53a2df9b59d293bd7","extensions\u002Fbrowser\u002Fskills\u002Fbrowser-automation",82861,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw","https:\u002F\u002Fopenclaw.ai","https:\u002F\u002Fgithub.com\u002Fopenclaw","Your personal, open source AI assistant.","2026-11-12 03:01:25",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add openclaw\u002Fopenclaw --skill browser-automation",{"tool":60,"command":61},"bunx","bunx skills add openclaw\u002Fopenclaw --skill browser-automation",{"tool":63,"command":64},"pnpm","pnpm dlx skills add openclaw\u002Fopenclaw --skill browser-automation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Fbrowser\u002Fskills\u002Fbrowser-automation\u002FSKILL.md",true,[68],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Fpage-triage.md","REFERENCE","参考文档",4113,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Fbrowser\u002Fskills\u002Fbrowser-automation\u002Freferences\u002Fpage-triage.md",[75,81,104,120,142,164],{"skillNo":76,"name":77,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":40},"01M698VP84FNM6G9MR1HPX7MF7","lobster","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Flobster\u002FSKILL.md",[],[77],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":40},"01M698YY8QGQ7S8TJNKJG6VTPH","xurl","xurl CLI for authenticated X posts, replies, reads\u002Fsearch, DMs, media upload, followers, auth status, or raw v2 API calls.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md",[],[83,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103],"for","api","calls","replies","posts","upload","tap","install","brew","node","Media","search","npm","status","auth","cli",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":40},"01M698YWT1CJ0WK88WB909R9RT","weather","Current weather and forecasts with web_fetch, falling back to wttr.in curl for locations, rain, temperature, travel planning.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fweather\u002FSKILL.md",[],[106,111,112,95,113,96,114,115,116,117,39,118,88,119,29],"travel planning","travel","fetch","curl","https","help","planning","back","temperature",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":131,"publishedAt":40},"01M698YV2Q0R0JJKAWGFS21K0N","visualize","Create inline visuals for code and explanations, or author persistent OpenClaw dashboard widgets with show_widget.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fvisualize\u002FSKILL.md",[126],{"categoryNo":127,"categoryName":128,"taxonomyType":129,"taxonomyTypeDesc":130},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[122,132,133,134,135,88,29,136,137,138,139,140,9,141],"widgets","openclaw dashboard","author","inline","show","code","create","visuals","dashboard","widget",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":154,"publishedAt":40},"01M698YS2TRJH9ENG28HD9CD87","trello","Manage Trello boards, lists, and cards via the Trello REST API.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftrello\u002FSKILL.md",[148,151],{"categoryNo":149,"categoryName":150,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":152,"categoryName":153,"taxonomyType":129,"taxonomyTypeDesc":130},"01JBSEEDCAT000000000000030","开发工程师",[144,115,155,156,157,158,159,160,95,96,161,114,89,162,163],"cloud","manage","via","rest api","token","atlassian","jq","REST","developer",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":170,"publishedAt":40},"01M698YQ9Q3M4W78EWV2KSCSVW","tmux","Control tmux sessions\u002Fpanes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftmux\u002FSKILL.md",[],[166,95,171,172,88,173,174,175,176,177,178,179,96,180,181,182,183,184,185],"send","darwin","keys","paste","output","control","prompts","interactive","list","capture","panes","text","monitor","sessions","linux"]