Androidスマホの操作を自動化する必要性がでてきて、Appiumを用いて環境構築を行い、Pythonで自動化させましたので、メモ用記事です。1万字程あるので、お時間ある時に少しずつお読み進めていただければと思います。
Appiumとは?
Appium(アピウム)はオープンソースのテスト自動化ツールで、今回利用したアンドロイドだけでなく、iOS
にも対応しています。また、Appiumを実行するクライアント環境Windows、macOS、Linuxに対応しています。
今回はテスト自動化ではありませんが、アンドロイド操作自動化で使いました。
準備したもの(使ったもの)
準備したもの(ハード)とソフトで分けています。
準備/使用したハード
・パソコン(Windows 11 Home 24H2)
・スマホ(Android 14)
・USBデータ通信用ケーブル(充電用と異なるので、購入時はご注意ください)
使用したソフト
今回自動化するにあたって使用したソフトです。インストール方法等の詳細は後述します。
・Appium/Appium inspector
・JDK(Java SE Development Kit 23.0.1)
・Android Studio
(・タスクスケジューラ:Windowsに最初から入っています。定期的に自動実行する場合は利用すると便利です)
参考にしたサイト
以下、2記事を参考にさせていただきました。ありがとうございました。が、時間が経っているせいか、そのままではうまくできないこともありましたので、少しアレンジしました。
・setup appium in windows for Android
・Windows10でAppiumを使ってPythonで、スマフォ(Android端末)のアプリを起動し、画面遷移の操作を自動化して、スクリーンショットを取れるようになった件
Appiumインストール前の準備
Appiumインストールの前準備をしていきます。
JAVAのインストール
Java SE Development Kit本記事執筆時点ではJDK23が最新版でした。
環境変数に以下を設定しました。
| 変数 | 値の例 | 補足 |
| JAVA_HOME | C:\Program Files\Java\jdk-23 | JDKがインストールされたフォルダパス |
| Path | %JAVA_HOME%\bin\ | JDKの実行フォルダパス |
コマンドプロンプトを起動し、以下を入力します。
java -version以下のような内容が返ってくればOK。
java version "23.0.1" 2025-3-23
Java(TM) SE Runtime Environment (build 23.0.1+11-39)
Java HotSpot(TM) 64-Bit Server VM (build 23.0.1+11-39, mixed mode, sharing)Android Studioのインストール
Android Studio公式のリンク先の真ん中 中段やや下からダウンロードしました。
リンク先のダウンロードタブから

下にスクロールして、推奨になっているexeファイルをDLし、インストールを実行します。

インストールが完了したら、インストール内容の確認です。Android Studioを起動すると、初回は以下のような画面がでてきますが、デフォルト設定で大丈夫です。

Nextをクリックしていくと同意が求められるのでAcceptの選択に変えて、Finishをクリック。ダウンロードが始まりますが、容量多めなので少し時間かかります(5分くらい?)。

ダウンロードが終わったら、Customize > All Settingへ移ります。

環境変数に以下を設定します。
| 変数 | 値の例 | 補足 |
| ANDROID_HOME | C:\Users\ユーザー名\AppData\Local\Android\Sdk | AndroidStudioをインストールするとLocalフォルダ下にフォルダが作成されます |
| Path | %ANDROID_HOME%\platform-tools\ |
スマホとPCをデータ通信用ケーブルで繋ぎ、コマンドプロンプトに以下を入力し、接続を確認します。
adb devices以下のような返答があれば接続できており、設定完了です。
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached接続できなかった時は環境変数のPathの%ANDROID_HOME%\platform-tools\最後の\が省かれていたりするので、Pathの設定が正しくできていない可能性があるので再度確認します。うまく接続できていない場合は以下のように返される事があります。
'adb' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。原因がわかった場合は、再度コマンドプロンプトを立ち上げ直し、再接続を試みます。
またスマホの機種によっては初回接続時にスマホ画面に以下のような確認画面が表示されるので、「許可」を行います。(セキュリティの警告がでていることには違いないので、自己責任でお願いします)

Appium Inspectorのインストール
ここがちょっと曲者です。というより、普段と異なる挙動もあるので不安がでてくる工程です。AppiumはVer1.18まではInspectorと呼ばれるものとServerが分離していないので特に問題なくダウンロード、インストールできるのですが、Ver1.19以降はInspectorとServerが分離されています。
最新のバージョンをインストールした方がいいので、ここではVer1.19以降のインストール方法を記載します。
検索で「appium inspector download」と検索するとgithubがヒットします。ご自身のPCにあったものをダウンロードします。私はWindows版のexeファイルをダウンロードしました。

ダウンロード後、exeファイルを実行しようとすると、Microsoft Defenderさんに警告され、少しビビります。実行を推奨するものではありませんので、ご自身の責任において行ってください。(専用のPC(中古の捨てPCなど)があると少し安心して環境構築できるかもしれません)

上記の詳細情報をクリックすると実行ボタンが表示され実行できるようになります。

どのユーザーにインストールするか聞かれるので、選択してインストールします。

インストールが完了すれば、このStepは完了です。
Appiumのインストール
AppiumのServerもインストールしなくてはいけないので、順番に必要なファイルをインストールしていきます。
AppiumはNode.jsのパッケージとしてインストールできるので、まずはNode.jsを公式からインストールします。

ダウンロードしたファイルを実行してインストールを進めます。

コマンドプロンプトを再起動して、node -vを入力し、バージョン情報が返ってくれば正常にインストールできています。
node -v
v22.14.0コマンドプロンプトでnpm install -g appiumと入力し、コマンドを実行します。もし、以下のようなセキュリティエラーが返ってきたら、Set-ExecutionPolicy RemoteSigned -Scope CurrentUserと入力し、実行ポリシーを変更、npmを実行できるようにします。
npm install -g appium
npm : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\nodejs\npm.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ npm install -g appium
+ ~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccessSet-ExecutionPolicy RemoteSigned -Scope CurrentUser
npm install -g appiumセキュリティを元に戻したい場合はSet-ExecutionPolicy Restricted -Scope CurrentUserを入力すればOKです。
Appium UiAutomator2のインストール
Appiumを使ってスマホに接続するにはUiAutomator2というドライバーも必要になります。
コマンドプロンプトでAppium driver install uiautomator2 と入力するとインストールが始まります。公式のGitHubからもダウンロードできます。
appium driver install uiautomator2PCとAndroidの接続
Appium(PC)とアンドロイド端末を接続するために、PC側とスマホ側でそれぞれ以下の操作を行います。
Androidの設定
Appiumとつなぐためにアンドロイド端末で以下の操作を行います。
各スマホメーカーによって表示方法は異なりますので、対象スマホの開発者向けオプションの表示方法をネット検索してみてください。
(例)設定→端末情報→ビルド番号を5,6回タップ すると開発者向けオプションが表示されるようになります。
表示できるようになったら、開発者向けオプションを開きます。
(例)設定→システム→開発者向けオプション
開発者向けオプションの使用をONにし、USBデバッグをONにします。スリープモードにしないをONにする事をオススメしますが、ここは好みによってON or OFFにします。

PCの設定
Appiumを用いてスマホに接続するにはまずAppium Serverを起動します。コマンドプロンプトにてappiumと入力します。
appium初回起動時は以下のような許可が求められますが、許可します。

下記のような画面がでれば左下のDesired Capabilities(赤枠)に以下の情報を入力します。私は右側のJSON Representation(青枠)に直書きしようとしていて、なかなか接続できなかったので注意です。

| Name | Value |
| platformName | Android |
| appium:platform Version | 14.0 |
| appium:automationName | UiAutomator2 |
また、黄色枠の部分に
| Remote Host | 127.0.0.1 |
| Remote Port | 4723 |
を入力します。赤枠部分に入力すると青枠部分にも自動入力されます。右下のStart Sessionをクリックして、接続します。接続が完了すると、その時のスマホ画面がAppium上でも表示されます。

Appiumを用いたAndroid端末の操作
Appiumで表示されるとPC上でもAndroid端末を操作できます。色々機能があるのですが、ここでは操作自動化するための要素の取得方法について記載します。Youtubeを操作してみます。
赤枠部分のStart Recordingをクリックします。

録画がスタートした感じになります。

PC上でYoutubeをクリックすると、右下のSelected Elementの表示が切り替わるので、Tapをクリックしてみます。

Recorderの箇所にYoutubeアプリをTapする場合のコードが表示されます(ミセスに元気貰っています…)。またPC画面に表示されるスマホ画面と実機での画面も連動しており、同じ画面が表示されます。

Recorderの右上あたりに所望のプログラミング言語を選ぶと(ex.Python)をその言語でのコードが表示されます。

同様にスマホ操作をするようにPC画面でTapなどを選んで操作を続けていくと同じ操作がRecorder欄に記録されていきます。下図はミセス様動画を続けてTapしたときの例です。チャンネル登録もPC上で操作してTapすることにすると続いて記録されていきます。

スマホ上でのBackの操作も上図青枠の<をクリックすると行えます。今回のYoutube操作ではBackボタン3回でHOME画面に戻れました。
Recorderに記録された最終的なコード(HOME画面→Youtubeアプリ起動→Mrs.GREEN APPLEのチャンネル登録→HOME画面に戻る)は以下です。
el1 = driver.find_element(by=AppiumBy.ACCESSBILITY_ID,value = "Youtube")
el1.click()
el2 = driver.find_element(by=AppiumBy.ACCESSBILITY_ID,value = "Mrs.GREEN APPLE をチャンネル登録")
el2.click()
driver.execute_script('mobile: pressKey',{"keycode": 4})
driver.execute_script('mobile: pressKey',{"keycode": 4})
driver.execute_script('mobile: pressKey',{"keycode": 4})こんな感じでPC上でスマホ操作をすると各言語のコードが記録され、これをもとに自動化コードを行うことができます。
Pythonで自動化コードを書いてみる(Appium-Python-Client)
AppiumでPythonコードを実行するにはAppium-Python-Clientのインストールが必要になります。ターミナル等で以下のコマンドを入力します。
pip install Appium-Python-Client テストコードの実行
Appium公式には以下のようなテストコードがあります。
import unittest
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
capabilities = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='Android',
appPackage='com.android.settings',
appActivity='.Settings',
language='en',
locale='US'
)
appium_server_url = 'http://localhost:4723'
class TestAppium(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Remote(appium_server_url, capabilities)
def tearDown(self) -> None:
if self.driver:
self.driver.quit()
def test_find_battery(self) -> None:
el =self.driver.find_element(by=AppiumBy.XPATH,value='//*[@text="Battery"]')
el.click()
if __name__ == '__main__':
unittest.main()私の環境ではうまく動作しなかったので、capabilitiesとappium_server_url を少しいじりました。
【変更後】
import unittest
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "14.0"
desired_caps["appium:deviceName"] = "Android"
desired_caps["appium:automationName"] = "UiAutomator2"
desired_caps["ensureWebviewsHavePages"] = True
options = UiAutomator2Options().load_capabilities(desired_caps)
driver = webdriver.Remote('http://127.0.0.1:4723',options=options)
class TestAppium(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Remote(appium_server_url, capabilities)
def tearDown(self) -> None:
if self.driver:
self.driver.quit()
def test_find_battery(self) -> None:
el =self.driver.find_element(by=AppiumBy.XPATH,value='//*[@text="Battery"]')
el.click()
if __name__ == '__main__':
unittest.main()アプリのPythonでの自動操作
ここからようやくアプリの自動操作ができるようになります。アプリをAppium×Pythonで自動操作するために、appPackage / appActivity の情報を取得して、操作することにします。
appPackage情報の取得
スマホとPCを接続します。
コマンドで以下を入力します。
adb shell pm list packages | findstr youtube私のスマホの場合、以下が出力されました。
package:com.google.android.apps.youtube.music
package:com.google.android.youtube今回必要なappPackage情報はcom.google.android.youtubeになります。
appActivity情報の取得
スマホとPCを接続します。
スマホ上でYoutubeアプリを起動します。
コマンドで以下を入力します。
adb shell dumpsys window | findstr mCurrentFocus以下のような内容が出力されれば成功です。
mCurrentFocus=Window{7a26223u0com.google.android.youtube/com.google.android.youtube.app.honeycomb.Shell$HomeActivity}この場合appActivityに該当するのはcom.google.android.youtube.app.honeycomb.Shell$HomeActivityの部分です。
Chat GPT端末によっては以下のほうがappActivity情報がでてくるよ!
adb shell dumpsys activity activities | findstr mResumedActivity私は adb shell dumpsys window | findstr mCurrentFocusで大丈夫でした。
Pythonコーディング
上記 appPackage / appActivity情報とAppium InspectorのRecording機能を使って記録したコードを元にYoutube
アプリを起動→Mrs.GreenAppleを検索→Mrs.GreenAppleのチャンネル登録のコードは次のようになりました。
import sys
sys.path.append("/Users/”ユーザー名”/AppData/Local/Programs/Python/Python313/Lib/site-packages")
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.options.android import UiAutomator2Options
from tkinter import Tk,messagebox
import tkinter.simpledialog as simpledialog
desired_caps = {}
desired_caps["appium:appPackage"] = "com.google.android.youtube"
desired_caps["appium:appActivity"] = "com.google.android.youtube.app.honeycomb.Shell$HomeActivity"
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "14.0"
desired_caps["appium:deviceName"] = "F13"
desired_caps["appium:automationName"] = "UiAutomator2"
desired_caps["noReset"] = True
desired_caps["ensureWebviewsHavePages"] = True
options = UiAutomator2Options().load_capabilities(desired_caps)
driver = webdriver.Remote('http://127.0.0.1:4723',options=options)
#ここまででYoutubeが起動する。起動に時間がかかるケースもあるので10秒待機
time.sleep(10)
el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="検索")
el1.click()
time.sleep(3)
el2 = driver.find_element(by=AppiumBy.ID, value="com.google.android.youtube:id/search_edit_text")
el2.send_keys("ミセス")
time.sleep(3)
el3 = driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR, value="new UiSelector().resourceId(\"com.google.android.youtube:id/search_type_icon\").instance(0)")
el3.click()
time.sleep(3)
el4 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="Mrs. GREEN APPLE をチャンネル登録")
el4.click()
time.sleep(3)
messagebox.showinfo('メッセージ', 'チャンネル登録完了!!')各要素をクリックした後、画面の遷移が追いつかない事が想定されましたので、time.sleep(3)で待機を入れています。これぐらいの操作であれば、そこまでタイムロスはありませんが、処理が増えるとロスが増えます。
そこで要素表示されるまでは待機、要素が確認できればクリックという仕様に変更するため、WebDriverWaitを使うよう変更をします。
変更後
import sys
sys.path.append("/Users/”ユーザー名"
/AppData/Local/Programs/Python/Python313/Lib/site-packages")
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
import time
from tkinter import Tk,messagebox
import tkinter.simpledialog as simpledialog
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Import Appium UiAutomator2 driver for Android platforms (AppiumOptions)
from appium.options.android import UiAutomator2Options
desired_caps = {}
desired_caps["appium:appPackage"] = "com.google.android.youtube"
desired_caps["appium:appActivity"] = "com.google.android.youtube.app.honeycomb.Shell$HomeActivity"
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "13.0"
desired_caps["appium:deviceName"] = "f13"
desired_caps["appium:automationName"] = "UiAutomator2"
desired_caps["noReset"] = True
desired_caps["ensureWebviewsHavePages"] = True
options = UiAutomator2Options().load_capabilities(desired_caps)
driver = webdriver.Remote('http://127.0.0.1:4723',options=options)
#ここまででYoutubeが起動する。
#挙動が安定しないことがあったので、time.sleep(10)で10秒待機
time.sleep(10)
# 「検索」の要素が表示されまで15秒待機、表示され次第クリック
try:
WebDriverWait(driver,15).until(EC.element_to_be_clickable((AppiumBy.ACCESSIBILITY_ID,"検索"))).click()
except:
print("「検索」要素なし")
#検索窓が表示されるまで15秒待機、表示され次第、”ミセス”の文字列を入力
try:
WebDriverWait(driver,15).until(EC.element_to_be_clickable((AppiumBy.ID,"com.google.android.youtube:id/search_edit_text"))).send_keys("ミセス")
except:
print("sendkey失敗")
#検索結果が表示されるまで15秒待機、検索結果の1つ目の結果をクリック
try:
WebDriverWait(driver,15).until(EC.element_to_be_clickable((AppiumBy.ANDROID_UIAUTOMATOR,"new UiSelector().resourceId(\"com.google.android.youtube:id/search_type_icon\").instance(0)"))).click()
except:
print("検索エラー")
#”チャンネルを登録”が表示されたらクリック
try:
WebDriverWait(driver,15).until(EC.element_to_be_clickable((AppiumBy.ACCESSIBILITY_ID,"Mrs. GREEN APPLE をチャンネル登録"))).click()
messagebox.showinfo('メッセージ', 'チャンネル登録完了!!')
except:
print("チャンネル登録失敗")
長くなりましたが、これでAppiumのPython環境設定とPythonでの自動化が達成できました!
補足
apkファイルの取得方法
apkファイルをWeb配布しているサイトもあるのですが、未知のサイトからファイルをダウンロードするのは気が引ける性格なので、スマホから取得する手順にしています。
スマホから取得する前にapkファイル名がわからないと検索しようがないので、公式のGoogle Playストアで確認します。
①公式のGoogle Playストアへアクセス
②検索で自動操作したいアプリを検索します。ここではYoutubeのapkファイル取得を目指します。


③検索した後にでてきたアプリをクリックして、遷移します。


④遷移先のURLの”id=”のあとから”&”の前までがapkファイル名になります。(下図例の場合、com.google.android.youtube)


①PCとスマホをデータ通信可のUSBケーブルでつなぎます。
②コマンドプロンプトでadb devicesと入力し、接続されていることを確認します。
③コマンドプロンプトで以下を実行し、保存先のファイルパスを取得します。
(com.google.android.youtubeの箇所は所望のアプリファイル名にしてください。)
adb shell pm list packages -f | findstr "com.google.android.youtube"④上記工程でファイルパスが返ってくるので、apkファイルをアクセス権がある場所にコピーします。私が上記でyoutubeのapkファイルを検索すると以下が返ってきました。
/data/app/~~TXSD3DK-2lKrJbLgWkhhIQ==/com.google.android.youtube-RsmfsM9xityPgnsJ-Jq9Mw==/base.apk=com.google.android.youtubeAndroid7.0以降では必要な対応になります。ここではアクセス権がある/storage/emulated/0/Downloadにコピーします。コマンドプロンプトで以下のコマンドを実行します。③で返ってきたファイルパスのうち
base.apkまでの箇所をコマンドに入力し、実行します。
adb shell cp /data/app/~~TXSD3DK-2lKrJbLgWkhhIQ==/com.google.android.youtube-RsmfsM9xityPgnsJ-Jq9Mw==/base.apk /storage/emulated/0/Download
⑤アクセス権がある場所にコピーされます。スマホのDownloadフォルダに保存されているので、PC
からスマホにアクセスすると、スマホのダウンロードフォルダにbase.apkファイルが保存されています。




コメント