본문으로 건너뛰기

DOM 조작 API

@grant CAT.agent.dom

DOM 조작 API는 완전한 브라우저 페이지 자동화를 제공합니다: 탐색, 콘텐츠 읽기, 스크린샷, 양식 상호 작용 및 DOM 모니터링.

탭 관리

listTabs — 탭 나열

const tabs = await CAT.agent.dom.listTabs();

열려 있는 모든 탭에 대한 정보를 반환합니다.

TabInfo[] 반환:

필드유형설명
tabIdnumber탭 ID
urlstring현재 URL
titlestring페이지 제목
activeboolean현재 활성 탭인지 여부
windowIdnumber속한 창의 ID
discardedboolean폐기되었는지(일시 중단) 여부

탐색

const result = await CAT.agent.dom.navigate(url, options?);

매개변수:

매개변수유형기본값설명
urlstring대상 URL (필수)
options.tabIdnumber현재 활성 탭사용할 탭
options.waitUntilbooleantrue페이지 로딩 완료를 기다릴지 여부
options.timeoutnumber30000밀리초 단위 시간 초과

NavigateResult 반환:

{ tabId: number; url: string; title: string }

콘텐츠 읽기

readPage — 페이지 콘텐츠 읽기

const page = await CAT.agent.dom.readPage(options?);

페이지 DOM을 구조화된 텍스트로 변환하고 <script>, <style>, <noscript>, <svg>, <link[rel=stylesheet]> 같은 관련 없는 요소를 자동으로 제거합니다.

매개변수:

매개변수유형기본값설명
options.tabIdnumber현재 활성 탭사용할 탭
options.selectorstringCSS 선택자, 일치하는 요소의 콘텐츠만 반환
options.maxLengthnumber최대 콘텐츠 문자 수, 초과 시 잘림
options.removeTagsstring[]제거할 추가 태그 이름

PageContent 반환:

필드유형설명
titlestring페이지 제목
urlstring페이지 URL
htmlstring처리된 페이지 텍스트 콘텐츠
truncatedboolean콘텐츠가 잘렸는지 여부
totalLengthnumber원본 콘텐츠의 총 길이

screenshot — 스크린샷 찍기

const shot = await CAT.agent.dom.screenshot(options?);

매개변수:

매개변수유형기본값설명
options.tabIdnumber현재 활성 탭사용할 탭
options.qualitynumber80JPEG 품질 (0-100)
options.fullPagebooleanfalse전체 페이지 캡처
options.selectorstringCSS 선택자, 일치하는 요소 영역만 캡처
options.saveTostringOPFS 작업 영역에 저장할 경로

ScreenshotResult 반환:

필드유형설명
dataUrlstringbase64 데이터 URL
pathstringOPFS 저장 경로 (saveTo 사용 시)
sizenumber파일 크기 (saveTo 사용 시)

캡처 모드 선택 방법:

시나리오동작
selector 제공CDP로 요소 경계를 찾아 스크린샷을 자름
백그라운드 탭CDP 스크린샷 시도, 실패 시 탭 활성화 후 captureVisibleTab 사용
전경 탭captureVisibleTab 직접 사용
// OPFS에 스크린샷 저장
const shot = await CAT.agent.dom.screenshot({
saveTo: "screenshots/page.png",
quality: 90
});
console.log(`Saved to ${shot.path}, size ${shot.size} bytes`);

페이지 상호 작용

click — 요소 클릭

const result = await CAT.agent.dom.click(selector, options?);

매개변수:

매개변수유형기본값설명
selectorstringCSS 선택자 (필수)
options.tabIdnumber현재 활성 탭사용할 탭
options.trustedbooleanfalse실제 마우스 이벤트를 보내기 위해 CDP 사용

ActionResult 반환:

필드유형설명
successboolean성공 여부
navigatedboolean클릭이 페이지 탐색을 트리거했는지 여부
urlstring탐색 후 새 URL
newTabboolean새 탭이 열렸는지 여부

trusted vs 일반 클릭:

  • trusted: false(기본값) — 주입된 JS로 element.click() 시뮬레이션, 빠르지만 일부 사이트에서 진짜가 아닌 이벤트로 감지할 수 있음
  • trusted: true — Chrome DevTools Protocol을 통해 실제 마우스 이벤트 전송, 실제 사용자 상호 작용과 구분할 수 없지만 디버거 권한 필요

fill — 양식 필드 채우기

const result = await CAT.agent.dom.fill(selector, value, options?);

매개변수:

매개변수유형설명
selectorstringCSS 선택자 (필수)
valuestring채울 값 (필수)
options.tabIdnumber사용할 탭
options.trustedboolean키보드 입력을 시뮬레이션하기 위해 CDP 사용

동작:

  • 일반 모드: element.value 설정 및 input 이벤트 디스패치
  • 신뢰 모드: CDP가 요소에 초점 → 문자별 입력

scroll — 페이지 스크롤

const result = await CAT.agent.dom.scroll(direction, options?);

매개변수:

매개변수유형설명
direction"up" | "down" | "top" | "bottom"스크롤 방향 (필수)
options.tabIdnumber사용할 탭
options.selectorstring전체 페이지 대신 특정 컨테이너 스크롤

ScrollResult 반환:

필드유형설명
scrollTopnumber스크롤 후 스크롤 위치
scrollHeightnumber전체 콘텐츠 높이
clientHeightnumber뷰포트 높이
atBottomboolean맨 아래로 스크롤되었는지 여부

waitFor — 요소 대기

const result = await CAT.agent.dom.waitFor(selector, options?);

지정된 요소가 페이지에 나타날 때까지 폴링합니다 (500ms마다 확인).

매개변수:

매개변수유형기본값설명
selectorstringCSS 선택자 (필수)
options.tabIdnumber현재 활성 탭사용할 탭
options.timeoutnumber10000밀리초 단위 시간 초과

WaitForResult 반환:

필드유형설명
foundboolean요소가 발견되었는지 여부
elementobject요소 정보 (found=true일 때만)
element.selectorstring일치한 선택자
element.tagstring태그 이름
element.textstring텍스트 콘텐츠
element.rolestringARIA 역할
element.typestringinput 유형
element.visibleboolean표시 여부

스크립트 실행

executeScript — JavaScript 실행

const result = await CAT.agent.dom.executeScript(code, options?);

매개변수:

매개변수유형기본값설명
codestringJavaScript 코드 (필수)
options.tabIdnumber현재 활성 탭사용할 탭

코드는 항상 페이지의 MAIN 세계에서 실행됩니다(페이지 자체 JS와 동일한 window 객체 공유). 따라서 페이지의 자체 함수를 호출하고 페이지 변수를 직접 읽을 수 있습니다 — 그러나 같은 이유로 확장 프로그램의 blob URL에 액세스할 수 없습니다(예: CAT.agent.opfs.read"blob" 모드에서 반환한 Blob으로 URL.createObjectURL()을 통해 만든 blob: URL). blob URL은 확장 프로그램 자체의 출처에 범위가 제한되기 때문입니다. 격리된 컨텍스트에서 blob URL로 작업해야 하는 경우 SkillScript를 대신 사용하세요 (Skill 개발 참조).

// 페이지 자체 JS 함수 호출 / 페이지 변수 읽기
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

// DOM 콘텐츠 읽기
const title = await CAT.agent.dom.executeScript(
"return document.querySelector('h1')?.textContent"
);

코드는 실행을 위해 new Function()으로 래핑되며 return 값을 지원합니다. 시간 초과는 30초입니다.

DOM 모니터링

Chrome DevTools Protocol을 사용하여 페이지의 DOM 변경 및 대화 상자 이벤트를 모니터링합니다.

startMonitor — 모니터링 시작

await CAT.agent.dom.startMonitor(tabId);

지정된 탭의 DOM 변경 및 대화 상자(alert/confirm/prompt) 모니터링을 시작합니다.

stopMonitor — 모니터링 중지

const result = await CAT.agent.dom.stopMonitor(tabId);

모니터링을 중지하고 수집된 변경 사항을 반환합니다.

MonitorResult 반환:

필드유형설명
dialogsArray<{ type, message }>대화 상자 목록
addedNodesArray<{ tag, id?, class?, role?, text }>새로 추가된 DOM 노드 요약

addedNodes는 노드 ID로 중복 제거되고 50개 항목으로 제한됩니다. 페이지에서 제거되었거나 표시되지 않는 노드는 자동으로 건너뜁니다. text는 노드의 outerHTML에서 추출된 일반 텍스트로 300자로 잘립니다.

peekMonitor — 모니터링 상태 확인

const status = await CAT.agent.dom.peekMonitor(tabId);

현재 모니터링 상태를 비파괴적으로 확인합니다.

MonitorStatus 반환:

필드유형설명
hasChangesboolean변경 사항이 있는지 여부
dialogCountnumber대화 상자 수
nodeCountnumber새로 추가된 노드 수

전체 예제

// ==UserScript==
// @name Auto form filler
// @match https://example.com/form
// @grant CAT.agent.dom
// ==/UserScript==

// 양식 로딩 대기
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

// 양식 채우기
await CAT.agent.dom.fill("input[name=username]", "test_user");
await CAT.agent.dom.fill("input[name=email]", "[email protected]");

// 동의 확인란 선택
await CAT.agent.dom.click("input[type=checkbox]#agree");

// 채워진 양식 스크린샷
await CAT.agent.dom.screenshot({
selector: "form#signup",
saveTo: "screenshots/form-filled.png"
});

// 제출 클릭
const result = await CAT.agent.dom.click("button[type=submit]", { trusted: true });
if (result.navigated) {
console.log("Form submitted successfully, navigated to:", result.url);
}