郭立 (leeguoo)

# agent にクロスオリジン iframe をクリックさせる:chrome-use がこの難題を突破した話

AI agent にブラウザをつなぐとき、本当に難しいのはページを開くことではなく、クロスオリジン iframe の中に隠れたフォームだ。読める、入力できる、でも「保存」だけクリックできない。この難題を突破した過程の記録。

2026年6月30日 · 記事 · 公開

このページの目次

AI agent にブラウザをつなぐと、最初さいしょはだいたい順調じゅんちょうです。ページをひらく、内容ないようむ、検索けんさくボックスに入力にゅうりょくする。本当ほんとうひとまらせるのは、クロスオリジン iframe のなかかくれたフォームです——Google Payments の受取うけとり情報じょうほう、さまざまな決済けっさいコンポーネント、KYC コントロール。agent はそのなか文字もじめるし、あたい入力にゅうりょくできる。でも、あの「保存」ボタンだけはクリックできないめるのに、完了かんりょうできない。

agent が「<ruby>窓<rt>まど</rt></ruby>の<ruby>中<rt>なか</rt></ruby>の<ruby>窓<rt>まど</rt></ruby>」に<ruby>手<rt>て</rt></ruby>を<ruby>伸<rt>の</rt></ruby>ばしてクリックしようとするが、<ruby>空振<rt>からぶ</rt></ruby>りする

この記事は、このかべえた過程かてい記録きろくです。主役しゅやくchrome-use——Rust でかれた、agent けのブラウザ自動化じどうか CLI です。Playwright も headless も使つかわず、あなたが**実際じっさいにログインしている**その Chrome を直接ちょくせつ操作そうさします。

プロジェクトページ:https://chrome-use.leeguoo.com/

なぜクロスオリジン iframe はこんなにむずかしいのか

普通ふつうのページなら簡単かんたんです。アクセシビリティツリーを取得しゅとくし、要素ようそ参照さんしょうり、クリックすればわりです。しかしクロスオリジン iframe(たとえば adsense.google.com のページに payments.google.com の iframe がまれている場合ばあい)では、一度いちどに3つの地雷じらいみます。

  1. セレクタがなかはいれない同一どういつオリジンポリシーのもとでは、外側そとがわのドキュメントで実行じっこうする CSS セレクタや eval は、iframe 内部ないぶの DOM に一切いっさいれられません。ここでは document.querySelectorやくちません。
  2. スクロールがはずれる。ページをスクロールしているつもりでも、実際じっさいにスクロールできるのは iframe 内部ないぶのスクロールコンテナです。wheel イベントは外側そとがわのドキュメントにおくられ、なか微動びどうだにしません——目標もくひょうぎょうはいつまでも「画面外がめんがい」にあり、ることすらできません。
  3. 座標ざひょう推測すいそくしてクリックするしかなくなるまえの2つの問題もんだいにより、「スクリーンショット + ピクセル座標ざひょう推測すいそく」へもどらざるをません。これはもっとも不正確ふせいかくで、となりのフィールドをあやまってクリックしやすい方法ほうほうです。**全体ぜんたい支払しはら情報じょうほう**を変更へんこうするフォームでは、クリック一回いっかい間違まちがいの代償だいしょうちいさくありません。

chrome-use の基盤きばん:agent にわたすのは HTML ではなく「参照さんしょう

突破とっぱ方法ほうほうはなまえに、まず chrome-use の基本きほん説明せつめいする必要ひつようがあります。これは、「HTML をモデルにべさせる」との根本的こんぽんてきちがいでもあります。

<ruby>恐<rt>おそ</rt></ruby>ろしい<ruby>量<rt>りょう</rt></ruby>の HTML を @e1 @e2 @e3 のようなきれいな<ruby>参照<rt>さんしょう</rt></ruby>に<ruby>置<rt>お</rt></ruby>き<ruby>換<rt>か</rt></ruby>える

chrome-use はページのソースコードを agent にげません。かわりにアクセシビリティツリーのスナップショット取得しゅとくし、操作そうさできるかく要素ようそみじか参照さんしょうけます。

$ 毎
- textbox "メール" [ref=e2]
- listbox "国/地域" [ref=e60]
- button "保存" [ref=e41]

agent はその参照さんしょう直接ちょくせつ操作そうさします。fill @e2 "..."click @e41 のように。1ページはだいたい 200–400 token でみ、DOM ノイズで画面がめん全体ぜんたいまることはありません。この参照さんしょう仕組しくみこそが、あとで iframe を貫通かんつうできる前提ぜんていになります——スナップショットが iframe 内部ないぶのノードを「られる」なら、参照さんしょう取得しゅとくできます。

3つのかべひとつずつえる

第一だいいちかべ: スナップショットに iframe 内部ないぶせる。 アクセシビリティツリーがクロスオリジン iframe を貫通かんつうし、内部ないぶのノードにも参照さんしょうけてってこられるようにします。修正しゅうせいすると、snapshot直接ちょくせつこう列挙れっきょします。

$ 毎
- textbox "電話番号 (任意)" [ref=e59]
- listbox "国/地域コード:日本 (+81)" [ref=e60]

——セレクタがはいれない場所ばしょにも、参照さんしょうはいれます。

第二だいにかべ: スクロールを iframe のスクロールコンテナにかせる。 wheel を外側そとがわのドキュメントへまとめておくるのをやめ、本当ほんとうにスクロールすべきコンテナをスクロールします。これでしたのフォームぎょうがようやく視野しやはいり、参照さんしょうれるようになります。

第三だいさんかべ(もっともかたい): クロスオリジン iframe ないの「有効ゆうこう」な送信そうしんボタンをクリックしても反応はんのうしない。 この段階だんかいがいちばんくるしいところでした。なぜなら、にはすべてただしいからです。

  • 実際じっさいのキー入力にゅうりょく番号ばんごうれた。get valueむと、たしかにはいっている。
  • 「保存」ボタンは有効ゆうこうになるべきタイミングで有効ゆうこうになった(ただしいあたいれるまえは disabled で、入力後にゅうりょくごあらわれる)。
  • そして click @e41——フォームは微動びどうだにしない。find text "保存"?クロスオリジンなのでれない。フォーカスして Enter / Space をす?それでも反応はんのうなし。

っているのに、どこもかしこもっていない。根本こんぽん原因げんいんは、クロスオリジン iframe ないの Material/フレームワークけいボタンが、合成ごうせいクリックけないことでした。さらに、fill入力にゅうりょくフィールドのあたいだけをえ、フレームワークが必要ひつようとする input/change イベントを発火はっかしていませんでした。そのためフォームがわは「変化へんかしていない」とおもい、保存ボタンは無効むこうのまま、またはクリックしてもなにきない状態じょうたいになります。

解決かいけつは2つにかれます。あたい入力にゅうりょくは**実際じっさいのキー入力にゅうりょくえる(かく文字もじ本物ほんもののイベントを発生はっせいさせるので、フレームワークが認識にんしきする)。クリックは、iframe ないのコンテンツノードにたいして、ただ click()かぶせるのではなく、本物ほんもののマウス/キーボード起動きどう**を一式いっしきおく必要ひつようがあります。

仕上しあげ: なかにクリックして、保存する

パーティーハットをかぶった agent が iframe に<ruby>手<rt>て</rt></ruby>を<ruby>伸<rt>の</rt></ruby>ばし、SAVE を<ruby>押<rt>お</rt></ruby>すことに<ruby>成功<rt>せいこう</rt></ruby>し、<ruby>緑<rt>みどり</rt></ruby>のチェックと saved が<ruby>表示<rt>ひょうじ</rt></ruby>される

3つのかべえると、全体ぜんたいながれがつながります。ひらく → 目標もくひょうぎょうまでスクロール → スナップショットで参照さんしょう取得しゅとく実際じっさいのキー入力にゅうりょくあたいれる → 保存を。あの「めるのに、完了かんりょうできない」みは、ここでわりです。

おなじように agent ブラウザ自動化じどうかをしているひとへ、経験けいけん

  • まずアクセシビリティ参照さんしょう使つかい、デフォルトでスクリーンショットの座標ざひょうクリックにげない。スナップショットが iframe をられるなら、参照さんしょうはピクセル推測すいそくよりずっと安定あんていします。スクリーンショットは canvas/WebGL のように、本当に構造こうぞうがない場面ばめんのこします。
  • クロスオリジン iframe は明確めいかく境界きょうかいです。セレクタと eval はそこでわりです。ツールに a11y ツリーを貫通かんつうさせるか、そうでなければ座標ざひょう盲目的もうもくてきにクリックするしかありません。
  • 入力にゅうりょくできるか」だけでなく、「送信そうしんできるか」をはかあたいはいったこと ≠ フレームワークがったこと、です。fill がイベントを発火はっかしないようなとしあなは、実際じっさいに保存をクリックしてはじめて露呈ろていします。
  • 実際じっさいにログインしたブラウザを使つかえるなら、headless はける。ログイン状態じょうたい、cookie、拡張機能かくちょうきのうがすべてそのままあり、自動化じどうかフィンガープリントもありません——これが chrome-use が「あなた自身じしんの Chrome を操作そうさする」みちえら理由りゆうでもあります。

ため

$ bash
curl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | sh

リポジトリは github.com/leeguooooo/chrome-use にあります。私はずっと、このような「あなた自身じしんのサブスクリプションを使つかい、agent を実際じっさいのブラウザ/端末たんまつにつなぐ」ツールをつくっています。進捗しんちょくX @leeguooooo投稿とうこうしています。

← 前の記事
agent に「Sign in with Google」を自分でクリックさせる——chrome-use が OAuth ポップアップログインを攻略
次の記事 →
Synology DSM で SSH ポートを開けても接続できない:ポートずれの振り返り

コメント

コメントは即時公開されますが、ポリシー違反時は非表示になる場合があります。

最大 1000 文字。