Ana içeriğe geç

DOM İşleme API'si

@grant CAT.agent.dom

DOM işleme API'si, eksiksiz tarayıcı sayfa otomasyonu sağlar: gezinme, içerik okuma, ekran görüntüleri, form etkileşimi ve DOM izleme.

Sekme yönetimi

listTabs — sekmeleri listele

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

Açık olan her sekme hakkındaki bilgileri döndürür.

TabInfo[] döndürür:

AlanTürAçıklama
tabIdnumberSekme kimliği
urlstringGeçerli URL
titlestringSayfa başlığı
activebooleanŞu anda etkin sekme olup olmadığı
windowIdnumberAit olduğu pencerenin kimliği
discardedbooleanAtılıp atılmadığı (askıya alındı)

Gezinme

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

Parametreler:

ParametreTürVarsayılanAçıklama
urlstringHedef URL (zorunlu)
options.tabIdnumbergeçerli etkin sekmeHangi sekmenin kullanılacağı
options.waitUntilbooleantrueSayfanın yüklemeyi bitirmesinin beklenip beklenmeyeceği
options.timeoutnumber30000Milisaniye cinsinden zaman aşımı

NavigateResult döndürür:

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

İçerik okuma

readPage — sayfa içeriğini oku

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

Sayfa DOM'unu yapılandırılmış metne dönüştürür; <script>, <style>, <noscript>, <svg> ve <link[rel=stylesheet]> gibi ilgisiz öğeleri otomatik olarak kaldırır.

Parametreler:

ParametreTürVarsayılanAçıklama
options.tabIdnumbergeçerli etkin sekmeHangi sekmenin kullanılacağı
options.selectorstringCSS seçici; yalnızca eşleşen öğenin içeriği döndürülür
options.maxLengthnumberMaksimum içerik karakteri; bunun ötesinde kısaltılır
options.removeTagsstring[]Kaldırılacak ek etiket adları

PageContent döndürür:

AlanTürAçıklama
titlestringSayfa başlığı
urlstringSayfa URL'si
htmlstringİşlenmiş sayfa metin içeriği
truncatedbooleanİçeriğin kısaltılıp kısaltılmadığı
totalLengthnumberOrijinal içeriğin toplam uzunluğu

screenshot — ekran görüntüsü al

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

Parametreler:

ParametreTürVarsayılanAçıklama
options.tabIdnumbergeçerli etkin sekmeHangi sekmenin kullanılacağı
options.qualitynumber80JPEG kalitesi (0-100)
options.fullPagebooleanfalseTam sayfayı yakala
options.selectorstringCSS seçici; yalnızca eşleşen öğenin alanını yakala
options.saveTostringOPFS çalışma alanında kaydedilecek yol

ScreenshotResult döndürür:

AlanTürAçıklama
dataUrlstringbase64 veri URL'si
pathstringOPFS kayıt yolu (saveTo kullanıldığında)
sizenumberDosya boyutu (saveTo kullanıldığında)

Yakalama modunun nasıl seçildiği:

SenaryoDavranış
selector verildiCDP ile öğenin sınırlarını bulur ve ekran görüntüsünü kırpar
Arka plan sekmesiCDP ekran görüntüsünü dener; başarısız olursa sekmeyi etkinleştirir ve captureVisibleTab kullanır
Ön plan sekmesiDoğrudan captureVisibleTab kullanır
// Bir ekran görüntüsünü OPFS'e kaydet
const shot = await CAT.agent.dom.screenshot({
saveTo: "screenshots/page.png",
quality: 90
});
console.log(`Saved to ${shot.path}, size ${shot.size} bytes`);

Sayfa etkileşimi

click — bir öğeye tıklama

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

Parametreler:

ParametreTürVarsayılanAçıklama
selectorstringCSS seçici (zorunlu)
options.tabIdnumbergeçerli etkin sekmeHangi sekmenin kullanılacağı
options.trustedbooleanfalseGerçek bir fare olayı göndermek için CDP kullan

ActionResult döndürür:

AlanTürAçıklama
successbooleanBaşarılı olup olmadığı
navigatedbooleanTıklamanın bir sayfa gezinmesi tetikleyip tetiklemediği
urlstringGezinmeden sonraki yeni URL
newTabbooleanYeni bir sekme açılıp açılmadığı

trusted ve normal tıklama:

  • trusted: false (varsayılan) — enjekte edilen JS ile element.click() simüle eder; hızlıdır, ancak bazı siteler bunu gerçek olmayan bir olay olarak algılayabilir
  • trusted: true — Chrome DevTools Protocol üzerinden gerçek bir fare olayı gönderir; gerçek kullanıcı etkileşiminden ayırt edilemez, ancak hata ayıklayıcı izni gerektirir

fill — bir form alanını doldur

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

Parametreler:

ParametreTürAçıklama
selectorstringCSS seçici (zorunlu)
valuestringDoldurulacak değer (zorunlu)
options.tabIdnumberHangi sekmenin kullanılacağı
options.trustedbooleanKlavye girişini simüle etmek için CDP kullan

Davranış:

  • Normal mod: element.value değerini ayarlar ve bir input olayı gönderir
  • Güvenilir mod: CDP öğeye odaklanır → karakter karakter yazar

scroll — sayfayı kaydır

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

Parametreler:

ParametreTürAçıklama
direction"up" | "down" | "top" | "bottom"Kaydırma yönü (zorunlu)
options.tabIdnumberHangi sekmenin kullanılacağı
options.selectorstringSayfanın tamamı yerine belirli bir kabı kaydır

ScrollResult döndürür:

AlanTürAçıklama
scrollTopnumberKaydırmadan sonraki kaydırma konumu
scrollHeightnumberToplam içerik yüksekliği
clientHeightnumberGörüntü alanı yüksekliği
atBottombooleanŞimdi en alta kaydırılıp kaydırılmadığı

waitFor — bir öğeyi bekle

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

Belirtilen öğenin sayfada görünmesi için yoklar (her 500 ms'de bir kontrol eder).

Parametreler:

ParametreTürVarsayılanAçıklama
selectorstringCSS seçici (zorunlu)
options.tabIdnumbergeçerli etkin sekmeHangi sekmenin kullanılacağı
options.timeoutnumber10000Milisaniye cinsinden zaman aşımı

WaitForResult döndürür:

AlanTürAçıklama
foundbooleanÖğenin bulunup bulunmadığı
elementobjectÖğe bilgisi (yalnızca found=true olduğunda)
element.selectorstringEşleşen seçici
element.tagstringEtiket adı
element.textstringMetin içeriği
element.rolestringARIA rolü
element.typestringinput türü
element.visiblebooleanGörünür olup olmadığı

Betik yürütme

executeScript — JavaScript çalıştır

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

Parametreler:

ParametreTürVarsayılanAçıklama
codestringJavaScript kodu (zorunlu)
options.tabIdnumbergeçerli etkin sekmeHangi sekmenin kullanılacağı

Kod her zaman sayfanın MAIN dünyasında çalışır (sayfanın kendi JS'iyle aynı window nesnesini paylaşır), bu nedenle sayfanın kendi işlevlerini çağırabilir ve sayfa değişkenlerini doğrudan okuyabilir — ancak aynı nedenle eklentinin blob URL'lerine erişemez (örn. CAT.agent.opfs.read değerinin "blob" modunda döndürdüğü Blob ile URL.createObjectURL() kullanarak oluşturduğunuz bir blob: URL), çünkü blob URL'leri eklentinin kendi kaynağına kapsamlanmıştır. İzole bir bağlamda bir blob URL ile çalışmanız gerekiyorsa, bunun yerine bir SkillScript kullanın (bkz. Skill Geliştirme).

// Sayfanın kendi JS işlevini çağır / bir sayfa değişkenini oku
const data = await CAT.agent.dom.executeScript(
"return window.__APP_STATE__"
);

// DOM içeriğini oku
const title = await CAT.agent.dom.executeScript(
"return document.querySelector('h1')?.textContent"
);

Kod, çalıştırma için new Function() içine sarılır ve bir return değerini destekler. Zaman aşımı 30 saniyedir.

DOM izleme

Bir sayfadaki DOM değişikliklerini ve iletişim kutusu olaylarını izlemek için Chrome DevTools Protocol'ü kullanır.

startMonitor — izlemeyi başlat

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

Belirtilen sekmede DOM değişikliklerini ve iletişim kutularını (alert/confirm/prompt) izlemeye başlar.

stopMonitor — izlemeyi durdur

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

İzlemeyi durdurur ve toplanan değişiklikleri döndürür.

MonitorResult döndürür:

AlanTürAçıklama
dialogsArray<{ type, message }>İletişim kutusu listesi
addedNodesArray<{ tag, id?, class?, role?, text }>Yeni eklenen DOM düğümlerinin özeti

addedNodes, düğüm kimliğine göre yinelenmelerden arındırılır ve 50 girişle sınırlandırılır; sayfadan kaldırılmış veya görünür olmayan düğümler otomatik olarak atlanır. text, düğümün outerHTML değerinden çıkarılan ve 300 karakterle sınırlandırılan düz metindir.

peekMonitor — izleme durumunu kontrol et

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

Geçerli izleme durumunu yıkıcı olmayan bir şekilde kontrol eder.

MonitorStatus döndürür:

AlanTürAçıklama
hasChangesbooleanHerhangi bir değişiklik olup olmadığı
dialogCountnumberİletişim kutusu sayısı
nodeCountnumberYeni eklenen düğüm sayısı

Tam örnek

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

// Formun yüklenmesini bekle
await CAT.agent.dom.waitFor("form#signup", { timeout: 5000 });

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

// Onay kutusunu işaretle
await CAT.agent.dom.click("input[type=checkbox]#agree");

// Doldurulmuş formun ekran görüntüsünü al
await CAT.agent.dom.screenshot({
selector: "form#signup",
saveTo: "screenshots/form-filled.png"
});

// Gönder'e tıkla
const result = await CAT.agent.dom.click("button[type=submit]", { trusted: true });
if (result.navigated) {
console.log("Form submitted successfully, navigated to:", result.url);
}