メインコンテンツまでスキップ

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(`${shot.path}に保存、サイズ ${shot.size} バイト`);

ページインタラクション

click — 要素をクリック

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

パラメータ:

パラメータデフォルト説明
selectorstringCSSセレクタ(必須)
options.tabIdnumber現在のアクティブタブ使用するタブ
options.trustedbooleanfalseCDPを使用して実際のマウスイベントをディスパッチ

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.trustedbooleanCDPを使用してキーボード入力をシミュレート

動作:

  • 通常モード:element.valueを設定し、inputイベントをディスパッチ
  • 信頼モード:CDPで要素にフォーカス → 1文字ずつ入力

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で作業する必要がある場合は、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 自動フォーム入力
// @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("フォーム送信成功、ナビゲート先:", result.url);
}