agent-browser 설치 후 클릭 결과는 전체 snapshot으로 확인한다
agent-browser는 접근성 트리 snapshot과 @e 참조로 브라우저를 조작하는 CLI다. macOS arm64와 Node v26.10.0에서 agent-browser@0.41.2를 격리 폴더에 설치하고, 외부 자원이 없는 로컬 HTML 한 페이지에서 클릭 뒤 snapshot 재확인까지 검증했다. 문서 확인과 실험은 2026-11-09 KST에 했다.
이 테스트 페이지에서 전체 snapshot은 원시 HTML보다 74.19% 작으면서 -i에 빠진 상태 문구를 담아 행동 뒤 검증에 썼다.
agent-browser 설치와 snapshot으로 확인할 것
원시 HTML을 통째로 넘기면 조작과 무관한 마크업까지 함께 읽힌다. 반대로 조작 대상만 추리면 클릭 뒤 상태가 바뀌었는지 놓칠 수 있다.
그렇다면 시스템 설정을 건드리지 않고 설치해 열기부터 종료까지 돌릴 수 있을까. 출력 바이트는 원시 HTML과 얼마나 다를까.
공식 문서가 설명하는 작동 방식
vercel-labs agent-browser 저장소의 README와 문서(릴리스 태그 v0.41.2, 2026-11-09 KST 확인)를 기준으로 했다. 문서에 따르면 Rust CLI는 첫 명령에서 백그라운드 데몬을 띄운다. 데몬은 Chrome DevTools Protocol로 브라우저를 제어하고, 명령 사이에도 브라우저를 열어 둔다.
Snapshots 문서는 snapshot이 접근성 트리를 짧은 텍스트와 참조로 돌려주고, 이후 click @e2처럼 조작한다고 설명한다. 요소가 교체되거나 페이지를 이동하면 ref가 무효화될 수 있다고도 적었다. 이번 실험 출력에서 참조는 [ref=e2] 형태로 나왔다.
브라우저 설치 위치는 cli/src/install.rs의 get_browsers_dir()가 정한다. 이 함수는 std::env::home_dir() 아래 .agent-browser/browsers를 쓴다.
Rust 공식 문서에 따르면 home_dir()는 Unix에서 HOME을 먼저 본다. 그래서 자식 프로세스의 HOME만 바꿔 설치 위치를 분리했다.
Configuration 문서의 AGENT_BROWSER_DOWNLOAD_PATH는 페이지에서 받는 파일을 저장하는 폴더다. Chrome 설치 캐시를 옮기는 옵션이 아니다.
로컬 페이지에서 잰 출력 크기
테스트 페이지 index.html은 127.0.0.1:18765에만 띄운 833바이트 문서다. Confirm 버튼과 상태 문구가 하나씩 있다. 같은 초기 페이지의 HTTP 본문과 표준 출력을 UTF-8 바이트로 비교했다.
| 비교 항목 | 크기(UTF-8 바이트) | 원시 HTML 대비 | Pending 포함 |
|---|---|---|---|
| 초기 HTTP HTML 본문 | 833 | 100.00% | 포함 |
초기 전체 snapshot | 215 | 25.81% (74.19% 감소) | 포함 |
초기 snapshot -i | 77 | 9.24% (90.76% 감소) | 제외 |
클릭 뒤 다시 받은 전체 snapshot은 227바이트였다. 상태가 바뀐 출력이라 초기 비교에는 넣지 않았다.
왜 출력 크기와 검증 범위가 달라지는가
전체 snapshot이 짧은 이유는 HTML 안의 CSS와 스크립트가 출력되지 않기 때문으로 본다. 태그 대신 역할, 이름, 참조 같은 속성만 남는 점도 길이를 줄인다.
-i가 짧은 이유는 다르다. -i는 상호작용 중심 필터라서 문단 본문과 status 아래 Pending을 뺐다. 같은 정보를 그대로 담은 채 줄인 압축이 아니다.
이번 -i 출력에는 버튼 말고 heading도 남았다. 출력 범위는 문서 설명보다 실제 출력으로 확인하는 편이 낫다.
클릭 뒤에는 -i를 다시 실행하지 않았다. 초기 -i 출력에 상태 문구가 없어서 결과 판정에는 전체 snapshot을 썼다.
격리 설치부터 상태 재확인까지
격리 폴더에 설치해 로컬 페이지를 연 뒤 트리를 읽고, 참조로 클릭하고, 상태를 다시 확인하는 순서다. <폴더>는 실험용으로 만든 격리 폴더다.
<폴더>/package에agent-browser@0.41.2를 로컬 설치하고 버전을 확인한다.- 격리한
HOME아래에 Chrome for Testing을 내려받는다. --executable-path로 그 Chrome을 지정해 로컬 페이지를 연다.- 전체
snapshot과snapshot -i로@e2와 초기 상태Pending을 확인한다. click @e2뒤 전체snapshot을 다시 받아 결과를 대조한다.close로 브라우저와 데몬을 끝낸다.
모든 명령에는 아래 환경변수를 넘겼다.
HOME=<폴더>/home
TMPDIR=<폴더>/tmp
XDG_CACHE_HOME=<폴더>/cache
NPM_CONFIG_CACHE=<폴더>/npm-cache
NPM_CONFIG_USERCONFIG=/dev/null
NPM_CONFIG_REGISTRY=https://registry.npmjs.org
AGENT_BROWSER_SOCKET_DIR=<폴더>/sockets
AGENT_BROWSER_SESSION=radar-local
AGENT_BROWSER_NO_VERSION_CHECK=1
AGENT_BROWSER_ALLOWED_DOMAINS=127.0.0.1
NO_COLOR=1
CI=1
설치에 쓴 명령은 다음과 같다.
npm install --prefix <폴더>/package --no-audit --no-fund agent-browser@0.41.2
<폴더>/package/node_modules/.bin/agent-browser --version
<폴더>/package/node_modules/.bin/agent-browser install
npm은 postinstall 스크립트 승인을 보류했다는 경고를 냈다. 스크립트는 승인하지 않았다. 그래도 패키지에 든 darwin-arm64 바이너리로 --version이 agent-browser 0.41.2를 출력했다.
install은 Chrome 157.0.8103.38(mac-arm64)을 <폴더>/home/.agent-browser/browsers/ 아래에 설치했다.
열기부터 종료까지는 아래 명령을 차례로 실행했다.
<폴더>/package/node_modules/.bin/agent-browser --executable-path "<폴더>/home/.agent-browser/browsers/chrome-157.0.8103.38/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing" open http://127.0.0.1:18765/index.html
<폴더>/package/node_modules/.bin/agent-browser snapshot
<폴더>/package/node_modules/.bin/agent-browser snapshot -i
<폴더>/package/node_modules/.bin/agent-browser click @e2
<폴더>/package/node_modules/.bin/agent-browser snapshot
<폴더>/package/node_modules/.bin/agent-browser close
여섯 명령 모두 종료코드 0이었고 표준 에러는 비어 있었다. open은 ✓ Local agent-browser test, click은 ✓ Done, close는 ✓ Browser closed를 출력했다. 클릭 전 두 snapshot은 다음과 같다.
- main
- heading "Local browser loop" [level=1, ref=e1]
- paragraph
- StaticText "This page has no external resources or network actions."
- button "Confirm" [ref=e2]
- status
- StaticText "Pending"
- heading "Local browser loop" [level=1, ref=e1]
- button "Confirm" [ref=e2]
클릭 뒤 전체 snapshot에서는 두 줄이 바뀌었다. 버튼은 button "Confirm" [disabled, ref=e2]가 됐고, 상태 문구는 StaticText "Confirmed"가 됐다.
✓ Done만 보고 끝내지 않고 이 두 줄로 결과를 확인했다. 클릭할 ref도 짐작하지 않고 직전 snapshot에 나온 값을 썼다.
close 뒤 데몬 PID가 종료되고 pid 파일과 소켓 파일이 지워졌다. 소켓 폴더에는 radar-local.target 파일 하나가 남았다.
이번 실험의 한계
바이트 수치는 직접 만든 로컬 페이지 한 장에서 나온 값이다. 일반 사이트나 대규모 SPA의 대표값이 아니다. 모델을 실행하지 않았으므로 토큰, 요금, 속도로 환산할 수 없다.
입력 fill, 페이지 이동, iframe, 로그인은 실험하지 않았다. 다중 세션 격리, --restore 영속성, 기본 1시간 유휴 종료는 문서로만 확인했다.
도구 연결 방식 자체를 고르는 기준은 MCP vs CLI — AI 코딩 에이전트 도구 연결, 둘 다 써보고 정리한 선택 기준에서 비교했다. 반환값보다 화면 상태를 다시 확인하는 이유는 브라우저 자동화 대기: 90초 타임아웃이 나도 화면부터 확인하는 이유와 이어진다.
결론
이번 로컬 페이지에서 agent-browser는 snapshot과 @e 참조만으로 클릭과 결과 확인까지 마쳤다. 결국 기준은 조작 대상을 고를 때는 -i를, 결과를 판정할 때는 상태 문구가 남는 전체 snapshot을 쓰는 것이다. 에이전트용 브라우저 도구를 검토한다면 별도 폴더와 HOME으로 격리한 뒤 open부터 close까지 여섯 명령을 먼저 실행해 보자.

댓글
댓글 쓰기