Browser Automation
CDP Chrome 자동화 — 스냅샷, 클릭, 내비게이션, 스크린샷, 탭. cli-jaw browser 명령어를 통해 ref 기반 요소 타겟팅으로 Chrome을 제어합니다.
cli-jaw serve가 실행 중이어야 하며, Google Chrome이 설치되어 있어야 합니다.빠른 참조
| 스킬 이름 | browser |
| 카테고리 | Automation |
| 상태 | Active (기본 로드) |
| 필수 요건 | cli-jaw 바이너리, Google Chrome |
| 선택 사항 | cliclick (Homebrew, 좌표 기반 클릭용) |
| 스크린샷 저장 경로 | ~/.cli-jaw/screenshots/ |
| 관련 스킬 | desktop-control, web-ai, vision-click |
| 스킬 파일 | ~/.cli-jaw/skills/browser/SKILL.md |
사전 요구 사항
cli-jaw serve가 실행 중이어야 합니다 — 브라우저 스킬은 cli-jaw 서버를 통해 통신합니다.- Google Chrome이 머신에 설치되어 있어야 합니다.
playwright-core가 cli-jaw 프로젝트에 설치되어 있어야 합니다 (CDP 통신에 사용).- 선택 사항: 좌표 기반 마우스 조작을 위해
brew install cliclick을 설치합니다.
핵심 워크플로우
모든 브라우저 자동화는 동일한 루프를 따릅니다: 스냅샷을 찍어 인터랙티브 요소를 확인하고, ref ID로 해당 요소에 액션을 수행한 뒤, 다시 스냅샷을 찍어 결과를 검증합니다.
내비게이션, 새로고침, 탭 전환 또는 페이지를 크게 변경하는 액션 이후에는 반드시 새로운 스냅샷을 찍으세요. ref ID는 가장 최근의 유효한 스냅샷에 속하며, 이후에는 무효화될 수 있습니다.
빠른 시작
# 자동화 세션 시작 (헤드리스, 창 표시 안 함)
cli-jaw browser start --agent
# 인터랙티브 브라우저 시작 (수동, 창 표시)
cli-jaw browser start
# URL로 이동
cli-jaw browser navigate "https://example.com"
# 인터랙티브 스냅샷 (ref ID 표시)
cli-jaw browser snapshot --interactive
# ref로 클릭
cli-jaw browser click e3
# 텍스트 입력 후 제출
cli-jaw browser type e5 "hello" --submit
# 스크린샷 촬영
cli-jaw browser screenshot
스냅샷 출력
snapshot --interactive 명령어는 페이지의 인터랙티브 요소 목록을 간결하게 반환하며, 각 요소에는 이후 명령어에서 사용할 짧은 ref ID가 부여됩니다.
e2 link "Images"
e3 textbox "Search" ← 여기에 입력: type e3 "query"
e4 button "Google Search" ← 클릭: click e4
e5 button "I'm Feeling Lucky"
e3과 같은 ref ID는 수명이 짧으며 최신 스냅샷에만 유효합니다. 페이지 변경 후에는 항상 스냅샷을 다시 찍으세요.
명령어 레퍼런스
브라우저 관리
| 명령어 | 설명 |
|---|---|
cli-jaw browser start [--port <auto>] [--headless] [--agent] | Chrome 실행. --agent = 헤드리스 자동화; 기본 = 인터랙티브 (창 표시). |
cli-jaw browser stop | 브라우저 세션 종료. |
cli-jaw browser status | 현재 CDP 연결 상태 및 포트 보고. |
cli-jaw browser doctor [--json] | CDP/런타임 소유권 불일치 진단 및 고아 프로세스 정리 범위 확인. |
cli-jaw browser cleanup-runtimes [--json] [--close --force] | 기본은 드라이런. jaw 소유 고아 런타임만 --close --force로 종료. |
cli-jaw browser reset [--force] | 브라우저 프로필 및 스크린샷 초기화. 명시적 요청 시에만 사용. |
관찰
| 명령어 | 설명 |
|---|---|
cli-jaw browser snapshot | 전체 페이지 스냅샷 (모든 노드). |
cli-jaw browser snapshot --interactive | 인터랙티브 요소만 ref ID와 함께 표시. 토큰 절약에 권장. |
cli-jaw browser snapshot --interactive --max-nodes 30 --json | 노드 수 제한 및 JSON 출력. |
cli-jaw browser screenshot | 현재 뷰포트 캡처. ~/.cli-jaw/screenshots/에 저장. |
cli-jaw browser screenshot --full-page | 전체 페이지 스크린샷 (스크롤 포함). |
cli-jaw browser screenshot --ref e5 | ref ID로 특정 요소의 스크린샷 촬영. |
cli-jaw browser screenshot --clip 0 0 320 180 --json | 영역 지정 스크린샷 및 JSON 출력 경로. |
cli-jaw browser text | 페이지의 모든 보이는 텍스트 추출. |
cli-jaw browser text --format html | 페이지 콘텐츠를 HTML로 추출. |
cli-jaw browser get-dom --selector ".card" --max-chars 2000 --json | CSS 선택자와 일치하는 DOM 하위 트리 가져오기. |
cli-jaw browser console --json --limit 20 | 콘솔 로그 항목 조회. |
cli-jaw browser network --json --limit 20 | 네트워크 요청 로그 조회. |
액션
| 명령어 | 설명 |
|---|---|
cli-jaw browser click e3 | ref ID로 요소 클릭. |
cli-jaw browser click e3 --double | 요소 더블 클릭. |
cli-jaw browser click e3 --right | 우클릭 (컨텍스트 메뉴). |
cli-jaw browser type e3 "hello" | 입력 필드에 텍스트 입력. |
cli-jaw browser type e3 "hello" --submit | 텍스트 입력 후 Enter 키 전송. |
cli-jaw browser press Enter | 키 입력 (Enter, Escape, Tab 등). |
cli-jaw browser hover e5 | 요소 위에 마우스 올리기. |
cli-jaw browser select e7 "option1" | 드롭다운에서 옵션 선택. |
cli-jaw browser drag e3 e5 | 한 요소에서 다른 요소로 드래그. |
cli-jaw browser mouse-click 400 300 | 절대 좌표에서 클릭. |
cli-jaw browser mouse-click 400 300 --double | 좌표에서 더블 클릭. |
cli-jaw browser move-mouse 400 300 | 좌표로 마우스 이동 (클릭 없음). |
cli-jaw browser mouse-down | 마우스 버튼 누르기. |
cli-jaw browser mouse-up --right | 마우스 버튼 놓기 (선택적으로 우클릭). |
내비게이션 및 검사
| 명령어 | 설명 |
|---|---|
cli-jaw browser navigate "https://example.com" | URL로 이동. |
cli-jaw browser open "https://example.com" | navigate의 별칭. |
cli-jaw browser tabs | 열린 탭 목록 표시. |
cli-jaw browser tabs --json | 탭 목록을 JSON으로 표시. |
cli-jaw browser active-tab --json | 활성 탭 정보를 JSON으로 가져오기. |
cli-jaw browser tab-switch 2 | 인덱스로 탭 전환. |
cli-jaw browser reload | 현재 페이지 새로고침. |
cli-jaw browser resize 1440 900 | 뷰포트 크기 변경. |
cli-jaw browser scroll --x 0 --y 1000 | 절대 위치로 스크롤. |
cli-jaw browser wait-for-selector ".toast-success" --timeout 30000 | CSS 선택자가 나타날 때까지 대기. |
cli-jaw browser wait-for-text "Dashboard" --timeout 30000 | 특정 텍스트가 페이지에 나타날 때까지 대기. |
cli-jaw browser evaluate "document.title" | 페이지 컨텍스트에서 JavaScript 실행. |
evaluate는 진단용 명령어입니다. web-ai와 같은 상위 레벨 벤더 워크플로우에서 임의의 사용자 제공 JavaScript를 전달하지 마세요.지원 라벨
| 영역 | 라벨 | 비고 |
|---|---|---|
로컬 cli-jaw browser 기본 명령어 | ready | 서버 기반 로컬 Chrome/CDP 전용 |
doctor 및 cleanup-runtimes | ready | 기본은 드라이런; 종료하려면 --force 필요 |
| 대시보드 표시/헤드리스 시작 분리 | ready | 표시 수동 모드와 헤드리스 에이전트 모드가 분리됨 |
| web-ai 프로바이더 워크플로우 | beta | web-ai 스킬 및 프로바이더별 게이트 사용 |
| 외부 호스팅/클라우드 CDP | deferred | 원격 브라우저 호스팅 지원을 제공하지 않음 |
규칙 및 제약 사항
- ref ID는 일시적입니다. 최신 스냅샷에만 유효합니다. 내비게이션, 새로고침, 탭 전환 또는 페이지를 변경하는 액션 이후에는 항상
snapshot --interactive를 다시 실행하세요. - 스냅샷에는
--interactive를 권장합니다 — 토큰 사용량을 줄일 수 있습니다. 전체 스냅샷은 비인터랙티브 노드를 포함하여 출력이 커질 수 있습니다. - 자동화 세션에는
--agent를 사용하세요. 헤드리스로 시작하여 브라우저 창이 표시되지 않습니다. - 일반
ps출력에서 찾은 Chrome 프로세스를 절대 종료하지 마세요. jaw 소유 프로세스를 내구성 런타임 레코드를 통해 검증하는cleanup-runtimes --close --force만 사용하세요. reset전에 확인하세요.reset명령어는 브라우저 프로필과 스크린샷을 삭제합니다. 사용자가 명시적으로 요청한 경우에만 사용하세요.evaluate는 진단 전용입니다. 상위 레벨 워크플로우에서evaluate를 통해 임의의 사용자 제공 JavaScript를 전달하지 마세요.- 비 DOM 요소 (Canvas, WebGL, 크로스 오리진 iframe, 커스텀 UI)의 경우 사용 가능한 ref가 없음을 확인한 후에만
vision-click스킬로 대체하세요.
일반 워크플로우
웹 검색
cli-jaw browser start --agent
cli-jaw browser navigate "https://www.google.com"
cli-jaw browser snapshot --interactive
cli-jaw browser type e3 "search query" --submit
cli-jaw browser snapshot --interactive
cli-jaw browser click e7
폼 입력
cli-jaw browser snapshot --interactive
cli-jaw browser type e1 "John Doe"
cli-jaw browser type e2 "john@example.com"
cli-jaw browser click e3 # Submit button
cli-jaw browser snapshot # 제출 확인
페이지 콘텐츠 읽기
cli-jaw browser navigate "https://news.ycombinator.com"
cli-jaw browser text # 일반 텍스트 추출
cli-jaw browser text --format html # HTML 콘텐츠
cli-jaw browser snapshot --interactive
AI 웹 워크플로우
ChatGPT 또는 기타 web-ai 워크플로우의 경우 web-ai 스킬을 사용하세요. 브라우저 스킬은 기본 페이지 제어를 담당하며, web-ai는 구조화된 질문 렌더링, 활성 탭 안전성, 응답 기준선 처리를 담당합니다.
~해줘 예시
브라우저 스킬을 트리거하는 자연어 요청 예시입니다. 한국어와 영어 모두 사용 가능합니다.
"구글 검색해줘 — CLI-JAW 설치 방법"
browser start --agent + navigate + type --submit + snapshot을 트리거합니다."이 웹사이트 스크린샷 찍어줘" / "이 페이지 캡처해줘"
navigate + screenshot --full-page를 사용합니다."이 페이지에서 로그인 폼 채워줘 — ID: admin, PW: test1234"
snapshot --interactive + type + click을 사용합니다."탭 목록 보여줘" / "열려있는 탭 중에 구글 탭으로 전환해줘"
tabs로 열린 탭을 나열한 뒤, tab-switch로 일치하는 탭으로 전환합니다. 다중 탭 관리 워크플로우입니다."브라우저 상태 확인해줘" / "Chrome 안 되면 진단해줘"
browser status와 browser doctor --json을 실행하여 CDP 연결 상태, 포트 소유권, 고아 런타임 상태를 확인합니다. 진단 워크플로우입니다.헤드리스 모드
Chrome을 헤드리스로 실행하는 세 가지 방법:
# 자동화에 권장
cli-jaw browser start --agent
# 수동 모드에서 명시적 헤드리스
cli-jaw browser start --headless
# 환경 변수 사용
CHROME_HEADLESS=1 cli-jaw browser start
모든 에이전트 자동화에는 --agent를 사용하세요. 브라우저 창이 표시되지 않으며, 자동화 세션에서 기본값으로 사용됩니다.
환경 변수
| 변수 | 설명 |
|---|---|
CHROME_HEADLESS=1 | 수동 시작 시 헤드리스 모드 활성화. |
CHROME_NO_SANDBOX=1 | Chrome 샌드박스 비활성화. Docker/CI 전용 — 일반 머신에서는 사용하지 마세요. |
기본 CDP 포트는 cli-jaw 서버 포트에서 파생됩니다. 명시적 오버라이드가 필요한 경우에만 cli-jaw browser start --port <port>를 사용하세요.
독립형 agbrowse 대안
단일 Chrome 인스턴스를 명시적으로 구동하려는 경우 (예: 로그인된 프로필을 유지하거나, cli-jaw serve와 두 번째 CDP 세션을 동시에 실행하지 않으려는 경우) 동일한 브라우저 명령어를 독립형 agbrowse CLI (npm install -g agbrowse)를 통해 사용할 수 있습니다. 플래그 체계는 동일하며, 바이너리 접두사만 다릅니다.
cli-jaw browser와 agbrowse를 동일한 --port에서 동시에 실행하지 마세요 — 두 번째 시작이 첫 번째 CDP를 재사용하게 되고, 영구 상태 파일이 충돌할 수 있습니다.런타임 정리
# 런타임 상태 진단
cli-jaw browser doctor --json
# 드라이런: 정리 대상 확인
cli-jaw browser cleanup-runtimes
# jaw 소유 고아 런타임 실제 종료
cli-jaw browser cleanup-runtimes --close --force
cleanup-runtimes는 의도적으로 보수적입니다. jaw 소유 Chrome 실행에 의해 기록된 내구성 browser-runtime-owner.json 레코드에 대해서만 동작합니다. 프로세스 명령줄은 여전히 기록된 PID, CDP 포트 및 프로필과 일치해야 합니다. --type=을 포함하는 Chrome 헬퍼 프로세스는 거부됩니다. 일반 ps 출력을 Chrome 프로세스가 종료해도 안전하다는 근거로 사용하지 마세요.
복구 전략
문제가 발생하면, 다음 액션을 취하기 전에 멈추고 상태를 점검하세요.
screenshot을 찍어 페이지에 실제로 무엇이 표시되고 있는지 시각적으로 확인합니다.snapshot --interactive를 다시 실행합니다. 페이지 변경 후 ref는 무효화됩니다.wait-for-selector 또는 wait-for-text를 사용합니다.status를 사용합니다. 복구 경로로 선택된 경우에만 stop/start합니다.reset 전에 확인합니다.vision-click 스킬을 사용합니다.문제 해결
| 증상 | 원인 | 해결 방법 |
|---|---|---|
| CDP 연결 거부됨 | Chrome이 시작되지 않았거나 잘못된 포트 | cli-jaw browser status로 확인 후 올바른 포트로 시작 |
running:false이면서 owner:jaw-owned | 잔존 런타임 메타데이터 또는 비활성 CDP | cli-jaw browser doctor 실행 후 browser start 재시도 |
| 이전 헤드리스 jaw Chrome이 남아 있음 | 내구성 jaw 소유 고아 후보 | cli-jaw browser cleanup-runtimes 드라이런 후 --close --force |
| 창이 테스트 브라우저만 열림 | Chrome 싱글톤이 실행을 흡수함 | 모든 Chrome 창을 닫은 후 start --agent 사용 |
| 헤드리스 CDP가 열리지 않음 | GUI 없는 환경에서 헤드리스가 요청되지 않음 | --headless 또는 --agent 추가 |
| 포트 충돌 | 다른 프로세스가 CDP 포트를 사용 중 | 다른 --port 선택 |
| 스냅샷이 너무 큼 | 페이지에 노드가 많음 | --interactive 또는 --max-nodes로 출력 제한 |
계획된 런타임 델타
다음 명령어들은 30_browser 레퍼런스 설계의 패리티 대상으로 계획되어 있습니다. 이후 PRD에서 명시적으로 업그레이드되지 않는 한 현재 런타임에서는 사용할 수 없습니다.
계획된 관찰 및 진단
cli-jaw browser console --clear --reload --duration 3000
cli-jaw browser network --reload --duration 1000
cli-jaw browser wait 2000
계획된 액션
cli-jaw browser resize 0 0 --fullscreen
cli-jaw browser scroll down
cli-jaw browser scroll up --amount 1000
wait-for <ref>는 레퍼런스 설계에서 더 이상 사용되지 않습니다. ref는 스냅샷 범위에 한정되기 때문입니다. 선택자 기반 또는 텍스트 기반 대기를 사용하세요.관련 스킬
| 스킬 | 관계 |
|---|---|
desktop-control | 통합 데스크톱 + 브라우저 자동화. DOM 대상은 CDP (브라우저 스킬)로, 데스크톱 앱은 Computer Use로 라우팅합니다. |
web-ai | AI 기반 웹 워크플로우 (예: ChatGPT). 브라우저 기본 명령어를 사용하되, 구조화된 질문 렌더링과 응답 처리를 추가합니다. |
vision-click | 비전 기반 클릭 타겟팅. 비 DOM 요소 (Canvas, WebGL, 크로스 오리진 iframe)에 대한 대체 수단. |
screen-capture | 화면 캡처 및 녹화. 시스템 레벨 캡처로 브라우저 스크린샷을 보완합니다. |
참고 사항
- ref ID는 수명이 짧으며, 최신 스냅샷 범위에서만 유효한 것으로 처리해야 합니다.
- 내비게이션 또는 주요 페이지 변경 후에는 항상
snapshot --interactive를 다시 실행하세요. - 토큰 절약을 위해
--interactive를 권장합니다. - 스크린샷은
~/.cli-jaw/screenshots/에 저장됩니다. - 에이전트 자동화에는
start --agent를 기본으로 사용해야 합니다. - Canvas, WebGL, 크로스 오리진 iframe, 커스텀 UI와 같은 비 DOM 요소는 명시적 대체로만
vision-click스킬을 사용하세요.