Lewati ke konten utama

API Manipulasi DOM

@grant CAT.agent.dom

API manipulasi DOM menyediakan otomatisasi halaman browser yang lengkap: navigasi, pembacaan konten, tangkapan layar, interaksi formulir, dan pemantauan DOM.

Manajemen tab​

listTabs — daftar tab​

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

Mengembalikan informasi tentang setiap tab yang terbuka.

Mengembalikan TabInfo[]:

BidangJenisDeskripsi
tabIdnumberID tab
urlstringURL saat ini
titlestringJudul halaman
activebooleanApakah ini tab yang sedang aktif
windowIdnumberID jendela tempatnya berada
discardedbooleanApakah telah dibuang (ditangguhkan)
const result = await CAT.agent.dom.navigate(url, options?);

Parameter:

ParameterJenisBawaanDeskripsi
urlstring—URL target (wajib)
options.tabIdnumbertab aktif saat iniTab mana yang digunakan
options.waitUntilbooleantrueApakah menunggu halaman selesai dimuat
options.timeoutnumber30000Batas waktu dalam milidetik

Mengembalikan NavigateResult:

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

Membaca konten​

readPage — baca konten halaman​

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

Mengubah DOM halaman menjadi teks terstruktur, secara otomatis menghapus elemen yang tidak relevan seperti <script>, <style>, <noscript>, <svg>, dan <link[rel=stylesheet]>.

Parameter:

ParameterJenisBawaanDeskripsi
options.tabIdnumbertab aktif saat iniTab mana yang digunakan
options.selectorstring—Selektor CSS; hanya konten elemen yang cocok yang dikembalikan
options.maxLengthnumber—Karakter konten maksimum; dipotong melebihi ini
options.removeTagsstring[]—Nama tag tambahan yang akan dihapus

Mengembalikan PageContent:

BidangJenisDeskripsi
titlestringJudul halaman
urlstringURL halaman
htmlstringKonten teks halaman yang diproses
truncatedbooleanApakah konten dipotong
totalLengthnumberPanjang total konten asli

screenshot — ambil tangkapan layar​

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

Parameter:

ParameterJenisBawaanDeskripsi
options.tabIdnumbertab aktif saat iniTab mana yang digunakan
options.qualitynumber80Kualitas JPEG (0-100)
options.fullPagebooleanfalseAmbil seluruh halaman
options.selectorstring—Selektor CSS; hanya area elemen yang cocok yang diambil
options.saveTostring—Jalur penyimpanan di ruang kerja OPFS

Mengembalikan ScreenshotResult:

BidangJenisDeskripsi
dataUrlstringdata URL base64
pathstringJalur penyimpanan OPFS (saat saveTo digunakan)
sizenumberUkuran file (saat saveTo digunakan)

Cara mode penangkapan dipilih:

SkenarioPerilaku
selector diberikanMenemukan batas elemen melalui CDP dan memotong tangkapan layar
Tab latar belakangMencoba tangkapan layar CDP; jika gagal, mengaktifkan tab dan menggunakan captureVisibleTab
Tab latar depanMenggunakan captureVisibleTab langsung
// Simpan tangkapan layar ke OPFS
const shot = await CAT.agent.dom.screenshot({
saveTo: "screenshots/page.png",
quality: 90
});
console.log(`Saved to ${shot.path}, size ${shot.size} bytes`);

Interaksi halaman​

click — klik elemen​

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

Parameter:

ParameterJenisBawaanDeskripsi
selectorstring—Selektor CSS (wajib)
options.tabIdnumbertab aktif saat iniTab mana yang digunakan
options.trustedbooleanfalseGunakan CDP untuk mengirim peristiwa mouse asli

Mengembalikan ActionResult:

BidangJenisDeskripsi
successbooleanApakah berhasil
navigatedbooleanApakah klik memicu navigasi halaman
urlstringURL baru setelah navigasi
newTabbooleanApakah tab baru dibuka

trusted vs. klik biasa:

  • trusted: false (bawaan) — mensimulasikan element.click() melalui JS yang disuntikkan; cepat, tetapi beberapa situs dapat mendeteksinya sebagai peristiwa yang tidak asli
  • trusted: true — mengirim peristiwa mouse asli melalui Chrome DevTools Protocol, tidak dapat dibedakan dari interaksi pengguna nyata, tetapi memerlukan izin debugger

fill — isi bidang formulir​

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

Parameter:

ParameterJenisDeskripsi
selectorstringSelektor CSS (wajib)
valuestringNilai yang diisi (wajib)
options.tabIdnumberTab mana yang digunakan
options.trustedbooleanGunakan CDP untuk mensimulasikan input keyboard

Perilaku:

  • Mode normal: mengatur element.value dan mengirim peristiwa input
  • Mode tepercaya: CDP memfokuskan elemen → mengetik karakter demi karakter

scroll — gulir halaman​

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

Parameter:

ParameterJenisDeskripsi
direction"up" | "down" | "top" | "bottom"Arah gulir (wajib)
options.tabIdnumberTab mana yang digunakan
options.selectorstringGulir wadah tertentu, bukan seluruh halaman

Mengembalikan ScrollResult:

BidangJenisDeskripsi
scrollTopnumberPosisi gulir setelah menggulir
scrollHeightnumberTinggi total konten
clientHeightnumberTinggi viewport
atBottombooleanApakah sekarang tergulir ke bawah

waitFor — tunggu elemen​

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

Menunggu elemen yang ditentukan muncul di halaman (memeriksa setiap 500ms).

Parameter:

ParameterJenisBawaanDeskripsi
selectorstring—Selektor CSS (wajib)
options.tabIdnumbertab aktif saat iniTab mana yang digunakan
options.timeoutnumber10000Batas waktu dalam milidetik

Mengembalikan WaitForResult:

BidangJenisDeskripsi
foundbooleanApakah elemen ditemukan
elementobjectInfo elemen (hanya saat found=true)
element.selectorstringSelektor yang cocok
element.tagstringNama tag
element.textstringKonten teks
element.rolestringPeran ARIA
element.typestringtipe input
element.visiblebooleanApakah terlihat

Eksekusi skrip​

executeScript — jalankan JavaScript​

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

Parameter:

ParameterJenisBawaanDeskripsi
codestring—Kode JavaScript (wajib)
options.tabIdnumbertab aktif saat iniTab mana yang digunakan

Kode selalu berjalan di MAIN world halaman (berbagi objek window yang sama dengan JS halaman itu sendiri), sehingga dapat memanggil fungsi halaman itu sendiri dan membaca variabel halaman secara langsung — tetapi untuk alasan yang sama tidak dapat mengakses URL blob ekstensi (mis. URL blob: yang Anda buat melalui URL.createObjectURL() dari Blob yang dikembalikan oleh CAT.agent.opfs.read dalam mode "blob"), karena URL blob dibatasi pada origin ekstensi itu sendiri. Jika Anda perlu bekerja dengan URL blob dalam konteks terisolasi, gunakan SkillScript sebagai gantinya (lihat Pengembangan Skill).

// Panggil fungsi JS halaman itu sendiri / baca variabel halaman
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

// Baca konten DOM
const title = await CAT.agent.dom.executeScript(
"return document.querySelector('h1')?.textContent"
);

Kode dibungkus dalam new Function() untuk dieksekusi, dan mendukung nilai return. Batas waktunya 30 detik.

Pemantauan DOM​

Menggunakan Chrome DevTools Protocol untuk memantau perubahan DOM dan peristiwa dialog di halaman.

startMonitor — mulai pemantauan​

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

Mulai memantau tab yang ditentukan untuk perubahan DOM dan dialog (alert/confirm/prompt).

stopMonitor — hentikan pemantauan​

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

Menghentikan pemantauan dan mengembalikan perubahan yang dikumpulkan.

Mengembalikan MonitorResult:

BidangJenisDeskripsi
dialogsArray<{ type, message }>Daftar dialog
addedNodesArray<{ tag, id?, class?, role?, text }>Ringkasan node DOM yang baru ditambahkan

addedNodes dideduplikasi berdasarkan ID node dan dibatasi 50 entri; node yang telah dihapus dari halaman atau tidak terlihat dilewati secara otomatis. text adalah teks biasa yang diekstrak dari outerHTML node, dipotong hingga 300 karakter.

peekMonitor — periksa status pemantauan​

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

Memeriksa status pemantauan saat ini secara non-destruktif.

Mengembalikan MonitorStatus:

BidangJenisDeskripsi
hasChangesbooleanApakah ada perubahan
dialogCountnumberJumlah dialog
nodeCountnumberJumlah node yang baru ditambahkan

Contoh lengkap​

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

// Tunggu formulir dimuat
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

// Isi formulir
await CAT.agent.dom.fill("input[name=username]", "test_user");
await CAT.agent.dom.fill("input[name=email]", "[email protected]");

// Centang kotak persetujuan
await CAT.agent.dom.click("input[type=checkbox]#agree");

// Tangkapan layar formulir yang telah diisi
await CAT.agent.dom.screenshot({
selector: "form#signup",
saveTo: "screenshots/form-filled.png"
});

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