Community코딩 & 개발github.com

브라우저 자동화

OpenClaw 브라우저 툴을 사용하여 웹 페이지를 제어할 때, 특히 다단계 플로우, 로그인 확인, 탭 관리, 또는 만료된 참조/타임아웃 복구 시 사용합니다.

브라우저 자동화란 무엇인가요?

이 스킬은 OpenClaw 브라우저 툴을 사용하는 AI 에이전트가 복잡한 웹 브라우징 작업을 체계적이고 안정적으로 수행할 수 있도록 설계된 가이드입니다. 단순한 페이지 확인을 넘어 다단계 플로우, 로그인 상태 확인, 탭 관리, 브라우저 상태 진단, 그리고 오류 복구 전략까지 포괄합니다. 주요 기능으로는 안정적인 탭 핸들 사용, 작업 전 스냅샷 기반 페이지 상태 확인, aria 참조를 활용한 정확한 요소 조작, 그리고 브라우저 배치 CLI를 통한 여러 동작의 효율적 실행이 있습니다. Code Mode에서는 exec 셀을 통해 브라우저를 호출하고 상태를 관리하는 방법을, 사용자 브라우저 프로필 및 Google Meet과 같은 특정 서비스에 대한 처리 방법도 상세히 설명합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/clawdbot/clawdbot/tree/main/extensions/browser/skills/browser-automation

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

브라우저 자동화은(는) 무엇을 하나요?

단순한 페이지 확인 이상으로 browser 툴이 필요할 때 이 스킬을 사용합니다.

운영 루프

  1. 작업하기 전에 브라우저 상태를 확인합니다:
    • 브라우저/플러그인 설정 자체가 손상되었을 수 있는 경우 openclaw browser doctor 또는 action="status"를 사용합니다.
    • 가용성을 위해 action="status"를 사용합니다.
    • 로그인 상태나 프로필 선택이 중요한 경우 action="profiles"를 사용합니다.
    • 재시도/타임아웃으로 인해 윈도우가 남아 있을 수 있는 경우 새 탭을 열기 전에 action="tabs"를 사용합니다.
  2. 안정적인 탭 핸들을 선호합니다:
    • 중요한 탭은 label로 엽니다(예: label="meet").
    • action="tabs" 또는 action="open" 후에 suggestedTargetId를 저장하고 이후 호출에서 targetId로 전달합니다.
    • suggestedTargetId는 레이블이 있으면 레이블이고, 그렇지 않으면 t1과 같은 안정적인 tabId 핸들입니다.
    • Chromium 대상 교체 시 변경될 수 있으므로 즉각적인 진단을 제외하고는 원시 DevTools targetId에 의존하지 않아야 합니다.
  3. 클릭하기 전에 읽습니다:
    • "페이지를 읽고 X에 답하세요"의 경우 action="text"와 선택적 selector 및 maxChars를 사용하여 제한된 가시적 텍스트(첫 번째 selector 일치, 그렇지 않으면 article/main/body)를 가져옵니다. 기존 세션 프로필에서는 snapshot을 대신 사용합니다. 효율적인 스냅샷은 대부분의 산문을 생략합니다.
    • 가상화된 목록의 경우 각 세그먼트를 스크롤하고 관련 행만 캡처한 후 결과를 병합합니다.
    • 의도한 targetId에 대해 action="snapshot"을 사용합니다.
    • query 스냅샷을 추가하여 모든 쿼리 토큰을 포함하는 줄을 찾습니다(대소문자 무시). 일치하는 줄은 참조를 유지합니다.
    • 후속 작업에 동일한 targetId를 사용하여 참조가 동일한 탭에 유지되도록 합니다.
    • 내구성 있는 Playwright 참조를 위해 지원되는 경우 refs="aria"를 요청합니다. snapshotFormat="aria"에서 axN 참조를 받은 경우, 해당 스냅샷 호출 직후에만 사용하십시오. 만료되었거나 바인딩되지 않은 axN 참조는 빠르게 실패하며 새 스냅샷이 필요합니다.
    • 링크 텍스트가 모호하거나 직접 탐색 대상이 깨지기 쉬운 클릭을 피할 수 있는 경우 urls=true를 사용합니다.
    • 시각적 위치가 중요한 경우 스냅샷 또는 스크린샷에 labels=true를 사용합니다. Playwright 기반 프로필에서 응답에는 캡처된 이미지의 좌표 공간에서 각 참조의 경계 상자가 포함된 annotations 배열({ref, number, role, name?, box})이 포함되므로, 다시 스냅샷을 찍지 않고 위치를 추론할 수 있습니다. 스크린샷 레이블은 fullPage=true(CLI: --full-page)와 결합하여 전체 문서에 레이블을 지정하거나, ref/element와 결합하여 하나의 요소로 자를 수 있습니다. profile="user" 및 기타 기존 세션(chrome-mcp) 프로필은 페이지 스크린샷에 오버레이를 렌더링하지만 annotations를 첨부하거나 Playwright 전체 페이지/ref/element 프로젝션 도우미를 사용하지 않으므로 해당 프로필에서는 레이블이 지정된 이미지 자체에서 위치를 읽어야 합니다. 원시 CDP 폴백(Playwright 없음)은 레이블이 지정된 스크린샷을 전혀 지원하지 않으며 501을 반환하므로 Playwright를 사용할 수 있을 때만 labels를 요청하십시오.
  4. 좁게 행동합니다:
    • 최신 스냅샷의 ref와 함께 action="act"를 선호합니다.
    • navigate는 로드된 페이지의 간결한 스냅샷을 인라인으로 반환하고, 교차 문서 탐색을 보고하는 배치 act 결과에는 새로운 페이지 상태가 포함됩니다. 이러한 참조를 후속 스냅샷 호출 대신 직접 사용하십시오.
    • 탐색을 트리거하는 단일 작업 후, 모달 변경 또는 양식 제출 후에는 다음 작업 전에 다시 스냅샷을 찍습니다.
    • 맹목적인 대기를 피하십시오. 가능하면 보이는 UI 상태를 기다리십시오.
    • 해당 설정을 테스트할 때 device, colorScheme, timezoneId 또는 locale과 함께 action="emulate"를 사용합니다. 그런 다음 다시 스냅샷을 찍습니다. 기존 세션 프로필은 에뮬레이션을 지원하지 않습니다.
  5. 실제 차단 요소를 보고합니다:
    • 선택적 URL/유형 filter 및 limit(기본값 최근 50개 항목)와 함께 action="requests"를 사용하여 네트워크 오류를 디버깅합니다. clear=true는 읽은 후 수집된 로그를 지웁니다. 관리되는 프로필을 사용하십시오. 기존 세션 프로필은 이 로그를 지원하지 않습니다.
    • limit(기본값 최근 50개 항목)와 함께 action="errors"를 사용하여 페이지 오류를 디버깅합니다. clear=true는 읽은 후 수집된 로그를 지웁니다. 기존 세션 프로필은 이 로그를 지원하지 않습니다.
    • 페이지에 로그인, 권한, 캡차, 2FA, 카메라/마이크 승인 또는 기타 수동 단계가 필요한 경우 중지하고 사용자에게 정확히 무엇이 필요한지 알려줍니다.
    • 현재 페이지에 권한 또는 온보딩 대화 상자가 표시된다고 해서 브라우저가 로그인되지 않았다고 주장하지 마십시오. 먼저 보이는 UI를 검사하십시오.

브라우저 배치 CLI

openclaw browser batch는 하나의 /act 호출(에이전트 툴을 통해 도달되는 동일한 kind="batch" 런타임)에서 중첩된 /act 동작 배열을 실행하므로, CLI 사용자와 스크립트는 wait, click, type 및 evaluate와 같은 동작을 작업별 왕복 없이 하나의 재생 가능한 계획으로 결합할 수 있습니다. actions[]의 각 항목은 /act 라우트가 허용하는 폐쇄된 합집합인 BrowserActRequest이며, 임의의 openclaw browser 하위 명령이 아닙니다. batch는 profile="user" 및 기타 기존 세션(chrome-mcp) 프로필에서 지원되지 않습니다. 해당 프로필에서는 개별적으로 동작을 전송하십시오.

  • CLI: openclaw browser batch --actions '<json>', --actions-file plan.json, 또는 stdin용 --actions-file -. --actions-file 및 stdin 입력은 1,000,000바이트로 제한됩니다. 더 큰 계획은 여러 배치 명령으로 분할하십시오. --continue는 stopOnError=false를 설정합니다. 기본값은 첫 번째 오류에서 중지됩니다.
  • 참조 수명 주기: 참조는 배치 전에 실행된 snapshot에서 가져옵니다(스냅샷은 중첩된 동작이 아닙니다). 탐색을 트리거하는 click 또는 DOM을 변경하는 evaluate와 같이 페이지 상태를 변경하는 중첩 동작은 배치의 나머지 부분에 대해 이전 참조를 무효화할 수 있습니다. 상태 변경 동작을 먼저 배치하거나, 다시 스냅샷을 찍은 후 후속 배치로 분할하십시오. 탐색 및 다시 스냅샷 찍기는 배치 외부에서 발생합니다. open, navigate 및 snapshot은 /act 종류가 아니기 때문입니다.
  • 대상 ID: 중첩 동작은 요청의 탭을 공유합니다. 다른 탭으로 확인되는 명시적인 중첩 targetId는 ACT_TARGET_ID_MISMATCH와 함께 거부됩니다.
  • 응답: { "results": [{ "ok": true } | { "ok": false, "error": "..." }, ...] } 순서대로. 기본 stopOnError를 사용하면 배열은 첫 번째 실패에서 끝납니다. 실패한 항목은 0이 아닌 값으로 종료됩니다. 스크립트에서 전체 응답을 보존하려면 --json을 사용하십시오.

코드 모드 루프

구성된 Decision 모델을 사용하여 명시적인 페이지 차단 요소 분류를 수행하려면 Page triage를 읽으십시오. Browser action="judge"는 선택된 Decision 제공자를 통해 제한된 관찰을 분류하고 페이지 텍스트가 아닌 답변을 기본 모델에 반환합니다. 텍스트 지원 Chromium 및 Lightpanda 프로필에서 작동합니다. Lightpanda 네이티브 judge()가 아닙니다.

tools.codeMode가 활성화되면 Browser 툴은 일반적인 턴을 갖지 않습니다. exec/wait 뒤에 카탈로그됩니다. exec 셀에서 비동기 전역 변수로 호출하십시오. exec 빠른 인덱스가 Browser 툴에 대해 광고하는 호출 가능한 이름(일반적으로 browser; 충돌하는 이름은 접미사가 붙고 클라이언트 툴이 동일한 이름을 얻을 수 있음)을 사용하십시오. 정확한 catalog.search("browser")는 이미 효과적인 호출 가능한 이름에 바인딩된 핸들을 반환하므로, 각 셀에서 핸들을 확인하고 하드 코딩된 리터럴 전역 변수 대신 호출하십시오. 결과가 비어 있으면 Browser 툴이 이 실행에서 카탈로그되지 않았음을 의미합니다.

루프를 통해 동일한 레이블이 지정된 탭을 유지하고 읽기와 동작을 번갈아 수행하십시오. 각 exec 셀은 새로운 VM을 시작합니다. 완료된 셀의 바인딩은 다음 셀에서 사라지며, waiting으로 남겨진 실행만 wait가 재개할 때까지 상태를 유지합니다. 따라서 비교 상태를 셀 간에 반환하고 반환된 값을 다음 셀에 다시 임베드하여 전달하십시오:

// previous = 마지막으로 완료된 셀이 반환한 url/newElements (새 VM이 이 셀을 실행하므로 이전 바인딩은 여기에 존재하지 않음).
const previous = { url: "https://example.com/inbox", newElements: 0 };
const [browser] = await catalog.search("browser", { limit: 1 });
const details = await browser({
  action: "snapshot",
  snapshotFormat: "ai",
  targetId: "task",
  refs: "aria",
  interactive: true,
});
const changed =
  details?.url !== previous.url ||
  (details?.newElements ?? 0) > 0 ||
  details?.blockedByDialog === true;
return {
  targetId: details?.targetId,
  url: details?.url,
  newElements: details?.newElements,
  stats: details?.stats,
  text: details?.text,
  changed,
};
  • 코드 모드 호출은 툴의 구조화된 details를 직접 반환합니다. 스냅샷 및 텍스트 관찰에는 직접 툴 출력과 동일한 신뢰할 수 없는 콘텐츠 래퍼가 있는 제한된 text가 포함됩니다. 페이지 데이터를 모델에 반환할 때 해당 래퍼를 유지하십시오. 기존 ID, stats 및 대화 상자 필드는 계속 사용할 수 있습니다.
  • 코드 모드 내에서 보이는 산문을 읽으려면 좁은 선택자로 text를 요청하십시오. 평가 기능이 필요하지 않습니다:
const [browser] = await catalog.search("browser", { limit: 1 });
const read = await browser({
  action: "text",
  selector: "main",
  maxChars: 2000,
  targetId: "task",
});
return { url: read?.url, text: read?.text };

스냅샷 query와 텍스트 selector/maxChars를 사용하여 래핑 전에 Browser 소유자에서 읽기를 좁히십시오. 차단된 대화 상자에는 여전히 보고된 복구 단계가 필요합니다. 페이지 텍스트가 스크립트 평가를 허용하지 않습니다.

  • 다음 단계에 필요한 필드만 반환하십시오. 전체 details 객체를 절대 반환하지 마십시오.
  • 완료된 셀은 상태를 공유하지 않습니다. 이전 셀의 반환된 url/newElements를 다음 셀에 다시 임베드하거나 하나의 셀 내에서 비교를 유지하십시오. wait가 재개하는 waiting 실행만 지속됩니다.
  • 각 작업과 다음 종속 작업 사이에 URL 또는 탭 확인을 삽입하십시오.
  • 배치가 aborted를 반환하면 계속하기 전에 새 스냅샷을 찍으십시오.
  • newElements가 양수이면 해당 요소를 먼저 검사한 다음 다시 임베드된 상태를 업데이트하십시오.
  • 단계 사이에 탐색이 예상되는 경우 별도의 작업 호출을 사용하십시오.

탭 위생

명명된 작업을 위해 탭을 만들기 전에 탭을 나열하고 여전히 사용 가능한 경우 기존 일치하는 레이블 또는 URL을 재사용하십시오.

예시:

{ "action": "tabs" }

적합한 탭이 없으면:

{ "action": "open", "url": "https://example.com", "label": "task" }

그런 다음 레이블로 대상 지정:

{ "action": "snapshot", "targetId": "task", "refs": "aria" }

재시도로 인해 중복이 생성되면 tabId로 추가 항목을 닫습니다:

{ "action": "close", "targetId": "t3" }

targetId로 "2"와 같은 숫자만 전달하지 마십시오. 숫자 탭 위치는 CLI openclaw browser tab select 2 도우미 전용입니다. 브라우저 툴 호출에는 suggestedTargetId, 레이블, tabId 또는 원시 대상 ID가 필요합니다.

오래된 참조 복구

작업이 누락되었거나 오래된 참조로 인해 실패하는 경우:

  1. 동일한 targetId를 다시 스냅샷합니다.
  2. 현재 보이는 컨트롤을 찾습니다.
  3. 새 참조로 한 번 재시도합니다.
  4. UI가 차단 상태로 전환된 경우 루핑하는 대신 차단 요소를 보고합니다.

기존 사용자 브라우저

기존 쿠키/로그인이 중요한 경우에만 profile="user"를 사용하십시오. 이는 사용자의 실행 중인 Chromium 기반 브라우저에 연결됩니다.

macOS에서 에이전트가 실제 Chrome 계열 프로필에서 복사된 쿠키와 함께 격리된 관리형 브라우저를 사용해야 하는 경우 action="importprofile"이 대안입니다. 먼저 action="profiles"를 사용하고 systemProfiles를 검사한 다음 새 관리형 프로필 이름으로 가져오십시오. 가져오기는 하나의 Keychain/Touch ID 동의 프롬프트를 요청합니다. 쿠키를 복사하며 로컬 스토리지나 IndexedDB는 복사하지 않습니다. DBSC(장치 바인딩 세션 자격 증명)로 인해 일부 Google 세션은 여전히 재인증이 필요할 수 있습니다.

profile="user" 및 기타 기존 세션 프로필의 경우 act:type, hover, scrollIntoView, drag, select 및 fill에서 timeoutMs를 생략하십시오. 해당 드라이버는 해당 작업에 대한 호출별 시간 초과 재정의를 거부합니다. act:evaluate는 timeoutMs를 허용합니다.

Google Meet 노트

Meet을 만들거나 참가할 때:

  • 카메라/마이크 권한 화면을 로그인 실패가 아닌 진행으로 취급하십시오.
  • 사람들이 당신의 말을 들을 수 있는지 묻는 경우 음성이 필요한 경우 마이크 옵션을 클릭하십시오.
  • Google이 로그인, 2FA, 계정 선택기 확인 또는 사용자 승인이 필요한 권한을 요청하는 경우 정확한 수동 작업을 보고하십시오.
  • 미팅 흐름당 하나의 레이블이 지정된 탭을 사용하십시오(예: label="meet"). 재시도 중에 재사용하십시오.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

1password

Set up and use 1Password CLI for sign-in, desktop integration, and reading or injecting secrets.

acp-router

Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Grok Build, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow). For coding-agent thread requests, read this skill first, then use only `sessions_spawn` for thread creation. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.

add-model-provider

Add and live-prove a model provider with non-interactive config one-liners, without exposing credentials.

agent-transcript

Requested GitHub PR/issue agent transcripts: redact, trim, preview, and insert safely.

apple-notes

Create, view, edit, delete, search, move, or export Apple Notes via the memo CLI on macOS.

apple-reminders

List, add, edit, complete, or delete Apple Reminders and reminder lists via remindctl.

auto-qa

Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.

autoreview

Structured code review through the shared OpenClaw agent-skills installation.

bear-notes

Create, search, and manage Bear notes via grizzly CLI.

blacksmith-testbox

Run Blacksmith Testbox for CI-parity checks, secrets, hosted services, migrations, or builds local cannot reproduce.

block-kit

Use proactively for structured or interactive Slack replies, and when asked to author or validate native Slack Block Kit JSON.

blogwatcher

Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.

blucli

BluOS CLI (blu) for discovery, playback, grouping, and volume.

bluebubbles

Send and manage iMessages via BlueBubbles, including attachments, tapbacks, edits, replies, and groups.

camsnap

Capture frames or clips from RTSP/ONVIF cameras and local webcams, including USB pan/tilt/zoom control.

canvas

Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.

channel-message-flows

Use when running QA Lab channel message flow evidence.

clawdtributor

Clawtributor PRs here, last week or another window: discover conversation refs, recheck GitHub, rank by impact.

clawhub

Search ClawHub for plugins by default, or skills and agent Templates when requested; add Templates; install, verify, update, uninstall, publish, or sync skills.

claw-score

Audit or refresh OpenClaw maturity scorecard docs from root taxonomy, maturity scores, and QA evidence artifacts without using maintainer discrawl data or committed inventory reports.

관련 스킬