Android/PCに映る全てのモノをAI自動テストするツールを開発した話
概要
Android/PCの画面に映るものなら一通り自動操作(テスト)できる、いわゆるADB版/PC版のComputer useを自前実装した話です。
主に要素が取りにくいゲームなどのE2E自動テスト目的で開発しています。
もちろんAppでもWebでもユーザーが操作できるモノなら操作可能です。
用途は……
- 人用のテストケース(手順とか期待結果が書いてあるアレ)を実施できるので、夜の間にやってもらう
- ユースケーステストの実施
今後、自チームのアプリの手動で行っているテストケースを上からやってもらってどこまでできるか、といったテスト実行者の一人として役割を果たせるかの実証実験を行っていく予定です。
まずは実演
gpt-5.1で動かしています。かなり画像識別は高速化をしていますが、まだまだ速度はお察しです。
画像識別(画像認識)の高速化手法は後述します。
PCゲームの例
以下は、自由時間に行動力を消費し活動を行うことでステータスが上がるゲームでの実験例です。
個人的に好きでプレイしている「まじかる☆プリンセス体験版」です。(製品版が楽しみ)
与えたプロンプト
音楽や美術、人と会話を任意に繰り返して行い、行動力が3未満になったら自宅に帰ってお休みしてください。
一度行った行動は行わず、別のところに行ってください。
期待結果 : 行動力が3未満であり自宅にいる
特に具体的な指示をしなくても、こんなことを自動で行っています。
- 学園から音楽室に移動
- 楽器の練習を実施して行動力消費
- 別のことをするために音楽室から地図に移動
- 地図から町に移動
- 町から農園に移動
- 種まきを実施して行動力消費
- 行動力が1/10になったので自室に帰るために地図に移動
- 地図から自室に移動
- 自室でお休みの選択
もちろん具体的な指示を与えればそのように動きます。
そして大事なのが最後です。

© Neotro Inc., MAGI Inc.

行動力が1/10で自室にいることが確認されています。
与えたプロンプトで指定した期待結果を満たしていることを確認し、テストを完了しました。
これでひとつのテストシナリオが完了です。
Androidアプリの例
2025/11/30追記
以下はAndroidアプリで、おしゃべりロボットの話す速度をアプリで設定するテストケースの実行例です。
与えたテストケース
1.話す速度をレベル4にする
2.設定を反映する
3.再度話す速度画面を確認する
期待結果:レベル4が反映されていること
よくあるような、チームでテストすることを前提とした細かいことが書かれておらず、やることだけが書いてあるようなテストケースです。
今回は毎回のAssersionは実行せず、最後が期待結果と一致するかだけのAssertionをしています。

細かく指定していませんがよしなに以下のような行動をしています。
- My Romiから会話の設定に遷移
- 話す速度画面に遷移
- タブからレベル4を選択
- ポップアップを閉じる
- 設定の反映を選択
- 再度戻ってAssertして期待結果通りになったことを確認
これを通常のE2E自動テストで実装するのはよくあることですが、地味に面倒なのですよね。
それを先ほどのテストケースで実現しています。
どのように動いているか
シンプルに言うと、画像認識をさせて要素の座標を特定、該当の座標に対してその時すべきactionを行う、です。
もちろん途中でPopupが出てきたりLevel upの文言が出てきても普通のE2E自動テストの様に止まらず、人間と同じように「OK」を押したりしながらと、シナリオ達成に向けて進んでくれます。
作った理由としては、GeminiなどもComputer useを出していますがブラウザのみという制約があったりします(2025/11/29現在)。ClaudeだとPCのComputer useがありますが、執筆時点ではお察しの性能でした。(公式もまだまだと言っている)
よって朝活の時間に自前実装しよう、となったわけです。

Plan AI
そのシナリオを完遂するために、どういった行動をすればよいか計画を立てます。
何もない状態だともちろん何も計画は立てられませんので、あらかじめ「この画面はこんな感じだよ」「こんなアクションができるよ」という情報を与えています。
また、計画の変更が生じた場合は、AIの判断により計画を変えられるようにしています。
計画は柔軟に変えるものです。


Vision AI
肝となるAIです。並列処理やクリック位置の精度向上など、普通にやるとイマイチなので色んな工夫をしています。詳細は後述します。
ここで画像認識を行い、各要素がどこにあるか特定します。
画面に「こういった要素があるよ」と細かく伝えずとも、必要なものは抽出されます。
gpt-5.1の精度はかなり良いです。gpt-5やmini、gpt-4.1などは若干ツールとして使用するにはまだまだといったところでした。

© Neotro Inc., MAGI Inc.

ちなみに自宅の画面で与えている情報はこれだけです。

Assertion AI
1回1回の行った行動に対して、現在の状況は意図通りかを判定するAIです。
E2E自動テストツールとして使う場合はKeyとなるAIです。
resultはPass/Warn/Failと、その結果の理由が出力されるようになっています。
Pass
問題がなかった時に出力されるresultです。以下の様になぜPassにしたかの理由も出力させています。
例えば行動力が10/10から-3で7/10になっている、といったところもよしなに確認してくれます。
そこまで見てと言ってないのにやってくれるとは、よきテスト実行者!


Warn
Tapをミスったといった、テスト実行に不備があったであろう時に出力される結果です。
統合AIに向けて、どうすべきか、というメッセージを出力させています。
これによりTapミスや操作ミスがあってもよしなにうまくやってくれます。

Fail
今回の実験ではFailは出なかったですが、UI崩れや、押すべき場所を押したのに遷移しないなど、明らかに問題がある時にFailが出力されます。
誤tapが続いても出力されるときがあります。
……ちなみに、「まじかる☆プリンセス」は下の地図の「場所を移動」のラベル部分をtapしても画面遷移しないようです。ラベルまで判定が載っていないです。このツールで見つけてしまいました(^-^;
統合AI
与えられたテストシナリオ、Vision AIからの画面情報、Assertion AIからの現状を統合して、何に対してどういったアクションをするか決定をするAIです。
何をしたいからこのアクションをする、といった理由をつけてもらうようにしています。
この理由をつけることにより、Assertion AIで意図通り動いているかの確認が可能となります。


ADBやwin32api
実際のtapやswipeの動作は、実は特に何か特別なツールを使っているわけではなく……
AndroidはADBをベタたたきです(笑)
adb shell input tap x y
よってAndroidの画面に映っているものなら全てtapやswipe、inputなどをすることができます。
textのinputは普通にやると日本語が入らないのでADBKeyboardを使うといった工夫はしています。
WinPCも同様です。win32apiのmouse_eventを使っています。
よってOSレベルでの操作をさせています。なので映っていれば普通に人がクリックしたのと同義なので何も気にせず操作可能です。
どのように画像認識の速度を上げたのか?
以下は900x2039のスマホ画像の要素のgpt5.1での通常の認識速度です。
22秒

以下はもう答えが書いていますが、8分割してgpt-5.1に並列処理させた認識速度です。
6.9秒。
3倍速くなっています。

実験に使ったゲームでは、私のお財布の関係で6分割にしましたが3秒台です。

ベタですが分割処理をすることで十分に早くなります。
あと、ただ分割したのではありません。横方向に分割です。

これは、基本的にはアプリやゲームに表示される文字は横書きであるためです。
最初に賽の目で分割したのですが、その際は文言がバラバラになってしまって認識精度が下がってしまいました。
ただし横に分割しているため、ちょうど文言が真ん中から切れてしまうような場合は認識が難しくなります。
また良い副作用として、分割したほうがより詳細な要素を抽出することができました。
画像一枚だとそんなに細かく要素を抽出してくれません。
分割並列処理の問題点
お金がとてもかかります。
ゲームの画面一回の認識で8回gpt-5.1に画像を投げているわけです。
テスト実行一回ごとにOpenAIのUsageを確認しに行っていました。。。
今は個人でやっているもので……。
グレースケールにするのは意味がない
試行錯誤の一つとして、グレースケールにするとチャンネル数が減るから処理速度が上がるかと思い試してみました。
しかし結果としては変わらず。
データ量は確かに減るのですが、OpenAI側では画像のサイズで計算量が変わり、リサイズされ同じ次元のテンソルに変換され計算量は変わらないようです。
キャッシュ機構
速度面ではキャッシュは定番ですね。
実装済みで、現在の画像がキャッシュ画像と差分が1%未満だと状態が同じとみなしキャッシュの情報を使用します。
ただ今回の実験動画では使用していません。
キャッシュを使った後もAssertion AIにはキャッシュの画像ではなく、実際の画像のみを送っているので問題があれば気づくことは可能です。
また、繰り返し動作などが発生した場合のために、AIの判断でキャッシュOFFにする機能も付けています。
単に同じ動作を繰り返したいときなどは大きな威力を発揮します。
どのように座標の精度を上げたのか?
途中困ってしまったのが、AIから出力される座標の精度が悪いことです。
結構ずれます。普通に要素抽出してクリックではほぼ使い物にならないと思ってよいです。
最初は分割もせず、スマホの画面でやっていたのですが、画面の下に行くほど精度は悪くなっていました。
これもOpenAI内での画像の処理によって歪むからとのことです。
基準座標として左上(0,0)と右下(width, height)を与えれば精度が上がると聞いたのですが、それも残念な結果でした。
そこでどうしたかというと以下です。

© Neotro Inc., MAGI Inc.
内部的にグリッドを描画してIDを振りました。
発想はシンプルです。
OpenAIの処理時に画像がゆがんで位置が変わったとしても、近くにIDがあればそれを指定すればいい、ですね。
目印方式です。これならば計算で座標が割り出せますしね。
これにより誤Tapをほとんどしなくなるようになりました。
(誤TapをしたとしてもAssertion AIで検知可能)
グリッドの問題点
ただ難点があって、画像認識速度が遅くなります。
A1といったラベルも画像から見れば要素と言えば要素です。プロンプトで除外していますが処理速度は体感できる程度に遅くなります。
また、例えば今回の行動力のような数字部分です。
そこにグリッドのIDがあった場合、数字に影響が発生していました。
こちらもプロンプトで「大きな数字の方」といったAIにわかるように伝える必要があります。
↓のように書いています。
"行動力" : "n/10で表示される。nは10の横の大きな数字を確認すること。nが3未満の場合、自宅に戻りお休みする必要がある",
AIはよしなにやってくれるが「AIがわかる書き方」をする必要がある
今回のツールは、画面の情報をある程度記載すればあとはよしなに動作してくれるツールです。
このツールだけではなく、AIを使うにあたって大事なことは「AIがわかる書き方」が必要ということです。
例えば今まで貼ってきたスクショの様にJsonで構造化して伝えると、多くの情報を整理してAIに伝えることができます。
あと例えば最初は
"図書館アイコン" : "図書館のアイコンをtapすると図書館に遷移する"
このように書いていましたが、なぜか遷移しませんでした。
座標や動作をよく見ると「本」のアイコンをタップしていました。
なのでこういった勘違いをしないような書き方が必要となります。
最終的には以下です。私もアイコンで判断というより文字列で判断していたのでそのままですね。
"図書館アイコン" : "図書館と文字列が表示されている。図書館に遷移する。"
ツールの公開について
実証実験を行い、テスト業務での実用に耐えうるのか成果をまとめたいと考えています。
そこからOSS化したいと思っています。
が、世の中の流れが速いので、その前に大手のADBが使えるComputer useが出てくると予想しています。
Discussion