Chuyển tới nội dung chính

API Thao tác DOM

@grant CAT.agent.dom

API thao tác DOM cung cấp tự động hóa trình duyệt hoàn chỉnh: điều hướng, đọc nội dung, chụp ảnh màn hình, tương tác biểu mẫu và giám sát DOM.

Quản lý tab

listTabs — liệt kê tab

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

Trả về thông tin về mỗi tab đang mở.

Trả về TabInfo[]:

TrườngKiểuMô tả
tabIdnumberID tab
urlstringURL hiện tại
titlestringTiêu đề trang
activebooleanCó phải tab hoạt động hiện tại
windowIdnumberID cửa sổ chứa nó
discardedbooleanCó bị loại bỏ (đình chỉ)

Điều hướng

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

Tham số:

Tham sốKiểuMặc địnhMô tả
urlstringURL mục tiêu (bắt buộc)
options.tabIdnumbertab hoạt động hiện tạiTab nào sử dụng
options.waitUntilbooleantrueCó chờ trang tải xong
options.timeoutnumber30000Hết thời gian chờ (milisecond)

Trả về NavigateResult:

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

Đọc nội dung

readPage — đọc nội dung trang

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

Chuyển đổi DOM trang thành văn bản có cấu trúc, tự động loại bỏ các phần tử không liên quan như <script>, <style>, <noscript>, <svg><link[rel=stylesheet]>.

Tham số:

Tham sốKiểuMặc địnhMô tả
options.tabIdnumbertab hoạt động hiện tạiTab nào sử dụng
options.selectorstringCSS selector; chỉ trả về nội dung phần tử khớp
options.maxLengthnumberSố ký tự tối đa; bị cắt sau đó
options.removeTagsstring[]Tên tag bổ sung cần xóa

Trả về PageContent:

TrườngKiểuMô tả
titlestringTiêu đề trang
urlstringURL trang
htmlstringNội dung văn bản trang đã xử lý
truncatedbooleanNội dung có bị cắt không
totalLengthnumberĐộ dài tổng của nội dung gốc

screenshot — chụp ảnh màn hình

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

Tham số:

Tham sốKiểuMặc địnhMô tả
options.tabIdnumbertab hoạt động hiện tạiTab nào sử dụng
options.qualitynumber80Chất lượng JPEG (0-100)
options.fullPagebooleanfalseChụp toàn bộ trang
options.selectorstringCSS selector; chỉ chụp vùng phần tử khớp
options.saveTostringĐường dẫn lưu trong không gian làm việc OPFS

Trả về ScreenshotResult:

TrườngKiểuMô tả
dataUrlstringURL dữ liệu base64
pathstringĐường dẫn lưu OPFS (khi dùng saveTo)
sizenumberKích thước tệp (khi dùng saveTo)
// Lưu ảnh chụp màn hình vào OPFS
const shot = await CAT.agent.dom.screenshot({
saveTo: "screenshots/page.png",
quality: 90
});
console.log(`Đã lưu tại ${shot.path}, kích thước ${shot.size} byte`);

Tương tác trang

click — nhấp vào phần tử

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

Tham số:

Tham sốKiểuMặc địnhMô tả
selectorstringCSS selector (bắt buộc)
options.tabIdnumbertab hoạt động hiện tạiTab nào sử dụng
options.trustedbooleanfalseDùng CDP gửi sự kiện chuột thực

Trả về ActionResult:

TrườngKiểuMô tả
successbooleanCó thành công
navigatedbooleanNhấp có kích hoạt điều hướng trang
urlstringURL mới sau điều hướng
newTabbooleanCó mở tab mới

trusted vs. nhấp thông thường:

  • trusted: false (mặc định) — mô phỏng element.click() qua JS.injected; nhanh, nhưng một số trang có thể phát hiện là sự kiện không chính thức
  • trusted: true — gửi sự kiện chuột thực qua Chrome DevTools Protocol, không thể phân biệt với tương tác thực của người dùng, nhưng cần quyền debugger

fill — điền trường biểu mẫu

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

Tham số:

Tham sốKiểuMô tả
selectorstringCSS selector (bắt buộc)
valuestringGiá trị cần điền (bắt buộc)
options.tabIdnumberTab nào sử dụng
options.trustedbooleanDùng CDP mô phỏng nhập từ bàn phím

Hành vi:

  • Chế độ thường: đặt element.value và gửi sự kiện input
  • Chế độ trusted: CDP focus phần tử → gõ từng ký tự

scroll — cuộn trang

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

Tham số:

Tham sốKiểuMô tả
direction"up" | "down" | "top" | "bottom"Hướng cuộn (bắt buộc)
options.tabIdnumberTab nào sử dụng
options.selectorstringCuộn container cụ thể thay vì toàn bộ trang

Trả về ScrollResult:

TrườngKiểuMô tả
scrollTopnumberVị trí cuộn sau khi cuộn
scrollHeightnumberTổng chiều cao nội dung
clientHeightnumberChiều cao viewport
atBottombooleanCó đang ở cuối trang

waitFor — chờ phần tử

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

Kiểm tra định kỳ phần tử được chỉ định xuất hiện trên trang (kiểm tra mỗi 500ms).

Tham số:

Tham sốKiểuMặc địnhMô tả
selectorstringCSS selector (bắt buộc)
options.tabIdnumbertab hoạt động hiện tạiTab nào sử dụng
options.timeoutnumber10000Hết thời gian chờ (milisecond)

Trả về WaitForResult:

TrườngKiểuMô tả
foundbooleanCó tìm thấy phần tử
elementobjectThông tin phần tử (chỉ khi found=true)
element.selectorstringSelector đã khớp
element.tagstringTên tag
element.textstringNội dung văn bản
element.rolestringVai trò ARIA
element.typestringLoại input
element.visiblebooleanCó hiển thị

Thực thi script

executeScript — chạy JavaScript

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

Tham số:

Tham sốKiểuMặc địnhMô tả
codestringMã JavaScript (bắt buộc)
options.tabIdnumbertab hoạt động hiện tạiTab nào sử dụng

Mã luôn chạy trong thế giới MAIN của trang (chia sẻ cùng đối tượng window với JS của trang), nên có thể gọi hàm của trang và đọc biến trực tiếp — nhưng vì lý do tương tự không thể truy cập URL blob của extension (ví dụ URL blob: tạo qua URL.createObjectURL() từ Blob trả về bởi CAT.agent.opfs.read ở chế độ "blob"), vì URL blob bị giới hạn trong gốc của extension. Nếu cần làm việc với URL blob trong ngữ cảnh cô lập, hãy dùng SkillScript (xem Phát triển Skill).

// Gọi hàm JS của trang / đọc biến trang
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

// Đọc nội dung DOM
const title = await CAT.agent.dom.executeScript(
"return document.querySelector('h1')?.textContent"
);

Mã được bọc trong new Function() để thực thi và hỗ trợ giá trị return. Hết thời gian chờ là 30 giây.

Giám sát DOM

Sử dụng Chrome DevTools Protocol để giám sát thay đổi DOM và sự kiện hộp thoại trên trang.

startMonitor — bắt đầu giám sát

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

Bắt đầu giám sát thay đổi DOM và hộp thoại (alert/confirm/prompt) trên tab được chỉ định.

stopMonitor — dừng giám sát

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

Dừng giám sát và trả về các thay đổi đã thu thập.

Trả về MonitorResult:

TrườngKiểuMô tả
dialogsArray<{ type, message }>Danh sách hộp thoại
addedNodesArray<{ tag, id?, class?, role?, text }>Tổng quan các nút DOM mới thêm

peekMonitor — kiểm tra trạng thái giám sát

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

Kiểm tra trạng thái giám sát hiện tại không phá hủy.

Trả về MonitorStatus:

TrườngKiểuMô tả
hasChangesbooleanCó thay đổi
dialogCountnumberSố hộp thoại
nodeCountnumberSố nút mới thêm

Ví dụ đầy đủ

// ==UserScript==
// @name Tự động điền biểu mẫu
// @match https://example.com/form
// @grant CAT.agent.dom
// ==/UserScript==

// Chờ biểu mẫu tải
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

// Điền biểu mẫu
await CAT.agent.dom.fill("input[name=username]", "test_user");
await CAT.agent.dom.fill("input[name=email]", "[email protected]");

// Đánh dấu ô đồng ý
await CAT.agent.dom.click("input[type=checkbox]#agree");

// Chụp ảnh biểu mẫu đã điền
await CAT.agent.dom.screenshot({
selector: "form#signup",
saveTo: "screenshots/form-filled.png"
});

// Nhấp gửi
const result = await CAT.agent.dom.click("button[type=submit]", { trusted: true });
if (result.navigated) {
console.log("Gửi biểu mẫu thành công, điều hướng đến:", result.url);
}