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
urlstringURL 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.selectorstringSelektor CSS; hanya konten elemen yang cocok yang dikembalikan
options.maxLengthnumberKarakter 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.selectorstringSelektor CSS; hanya area elemen yang cocok yang diambil
options.saveTostringJalur 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
selectorstringSelektor 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
selectorstringSelektor 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
codestringKode 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);
}