【Appium×Python】PythonでAndroid端末を操作する方法(Appium-Python-Client)


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が最新版でした。

STEP
インストール

こちらのページからDLしてインストールします。
Windows版の赤枠部分をダウンロードしてexeファイルを実行、インストールしました。

java-install^window-picture
STEP
環境変数設定

環境変数に以下を設定しました。

変数値の例補足
JAVA_HOMEC:\Program Files\Java\jdk-23JDKがインストールされたフォルダパス
Path%JAVA_HOME%\bin\JDKの実行フォルダパス
STEP
パスの確認

コマンドプロンプトを起動し、以下を入力します。

PowerShell
java -version

以下のような内容が返ってくればOK。

PowerShell
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のインストール

STEP
インストール

Android Studio公式のリンク先の真ん中 中段やや下からダウンロードしました。

リンク先のダウンロードタブから

android studio install step1-1

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

STEP
SDK Platform Tools インストールの確認

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

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

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

STEP
環境変数設定

環境変数に以下を設定します。

変数値の例補足
ANDROID_HOMEC:\Users\ユーザー名\AppData\Local\Android\SdkAndroidStudioをインストールするとLocalフォルダ下にフォルダが作成されます
Path%ANDROID_HOME%\platform-tools\
STEP
スマホとの接続確認

スマホとPCをデータ通信用ケーブルで繋ぎ、コマンドプロンプトに以下を入力し、接続を確認します。

PowerShell
adb devices

以下のような返答があれば接続できており、設定完了です。

PowerShell
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached

接続できなかった時は環境変数のPathの%ANDROID_HOME%\platform-tools\最後の\が省かれていたりするので、Pathの設定が正しくできていない可能性があるので再度確認します。うまく接続できていない場合は以下のように返される事があります。

PowerShell
'adb' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。

原因がわかった場合は、再度コマンドプロンプトを立ち上げ直し、再接続を試みます。

またスマホの機種によっては初回接続時にスマホ画面に以下のような確認画面が表示されるので、「許可」を行います。(セキュリティの警告がでていることには違いないので、自己責任でお願いします)

adbAndroidDebugBridgeの略です。

Appium Inspectorのインストール

ここがちょっと曲者です。というより、普段と異なる挙動もあるので不安がでてくる工程です。AppiumはVer1.18まではInspectorと呼ばれるものとServerが分離していないので特に問題なくダウンロード、インストールできるのですが、Ver1.19以降はInspectorとServerが分離されています。

最新のバージョンをインストールした方がいいので、ここではVer1.19以降のインストール方法を記載します。

STEP
Appium inspectorのexeファイルのダウンロード

検索で「appium inspector download」と検索するとgithubがヒットします。ご自身のPCにあったものをダウンロードします。私はWindows版のexeファイルをダウンロードしました。

appium-inspector-download-github
STEP
exeファイルの実行

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

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

appium inspector install caution image2

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

インストールが完了すれば、このStepは完了です。

Appiumのインストール

AppiumのServerもインストールしなくてはいけないので、順番に必要なファイルをインストールしていきます。

STEP
Node.jsのインストール

AppiumはNode.jsのパッケージとしてインストールできるので、まずはNode.jsを公式からインストールします。

node.js install image 1

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

node.js install image2


コマンドプロンプトを再起動して、node -vを入力し、バージョン情報が返ってくれば正常にインストールできています。

PowerShell
node -v
v22.14.0
STEP
Appiumのインストール

コマンドプロンプトでnpm install -g appiumと入力し、コマンドを実行します。もし、以下のようなセキュリティエラーが返ってきたら、Set-ExecutionPolicy RemoteSigned -Scope CurrentUserと入力し、実行ポリシーを変更、npmを実行できるようにします。

PowerShell
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 : UnauthorizedAccess
PowerShell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
npm install -g appium

セキュリティを元に戻したい場合はSet-ExecutionPolicy Restricted -Scope CurrentUserを入力すればOKです。

Appium UiAutomator2のインストール

Appiumを使ってスマホに接続するにはUiAutomator2というドライバーも必要になります。
コマンドプロンプトでAppium driver install uiautomator2 と入力するとインストールが始まります。公式のGitHubからもダウンロードできます。

PowerShell
appium driver install uiautomator2

PCとAndroidの接続

Appium(PC)とアンドロイド端末を接続するために、PC側とスマホ側でそれぞれ以下の操作を行います。

Androidの設定

Appiumとつなぐためにアンドロイド端末で以下の操作を行います。

STEP
開発者向けオプションの表示

各スマホメーカーによって表示方法は異なりますので、対象スマホの開発者向けオプションの表示方法をネット検索してみてください。

(例)設定端末情報ビルド番号を5,6回タップ すると開発者向けオプションが表示されるようになります。

STEP
開発者向けオプションの表示と設定

表示できるようになったら、開発者向けオプションを開きます。
(例)設定システム開発者向けオプション

開発者向けオプションの使用をONにし、USBデバッグをONにします。スリープモードにしないをONにする事をオススメしますが、ここは好みによってON or OFFにします。

sp for engineer image

PCの設定

STEP
Appium Serverの起動

Appiumを用いてスマホに接続するにはまずAppium Serverを起動します。コマンドプロンプトにてappiumと入力します。

PowerShell
appium

初回起動時は以下のような許可が求められますが、許可します。

nodejs first allow image
STEP
Appium Inspectorの起動

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

appium inspector setting
NameValue
platformNameAndroid
appium:platform Version14.0
appium:automationNameUiAutomator2


また、黄色枠の部分に

Remote Host127.0.0.1
Remote Port4723

を入力します。赤枠部分に入力すると青枠部分にも自動入力されます。右下のStart Sessionをクリックして、接続します。接続が完了すると、その時のスマホ画面がAppium上でも表示されます。

appium sp display image

Appiumを用いたAndroid端末の操作

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

赤枠部分のStart Recordingをクリックします。

appium sp display recording image1

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

appium sp display recording image2

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

appium sp display recording image3

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

appium sp display recording image4

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

appium sp display recording image5

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

appium sp display recording image6

スマホ上でのBackの操作も上図青枠の<をクリックすると行えます。今回のYoutube操作ではBackボタン3回でHOME画面に戻れました。

Recorderに記録された最終的なコード(HOME画面→Youtubeアプリ起動→Mrs.GREEN APPLEのチャンネル登録→HOME画面に戻る)は以下です。

Python
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のインストールが必要になります。ターミナル等で以下のコマンドを入力します。

Python
pip install Appium-Python-Client 

テストコードの実行

Appium公式には以下のようなテストコードがあります。

Python
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()

私の環境ではうまく動作しなかったので、capabilitiesappium_server_url を少しいじりました。

【変更後】

Python
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 の情報を取得して、操作することにします。

apk(Android Package Kit)ファイルと呼ばれるAndroid OSで作成されるアプリケーションファイルを使って起動させて操作させることもできます。ただ、その方法だとappiumにインストールする記述が必要で、既にスマホにインストールされているアプリを操作する記述と目的の異なるコードを書かないといけないので、ここではその方法を選択しませんでした。補足にapkファイルの取得方法を記載しています。

appPackage情報の取得

STEP
スマホとPCの接続

スマホとPCを接続します。

STEP
コマンド入力

コマンドで以下を入力します。

PowerShell
adb shell pm list packages | findstr youtube

私のスマホの場合、以下が出力されました。

PowerShell
package:com.google.android.apps.youtube.music
package:com.google.android.youtube

今回必要なappPackage情報はcom.google.android.youtubeになります。

appActivity情報の取得

STEP
スマホとPCの接続

スマホとPCを接続します。

STEP
Youtubeアプリの起動

スマホ上でYoutubeアプリを起動します。

STEP
コマンド入力

コマンドで以下を入力します。

PowerShell
adb shell dumpsys window | findstr mCurrentFocus

以下のような内容が出力されれば成功です。

PowerShell
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情報がでてくるよ!

PowerShell
adb shell dumpsys activity activities | findstr mResumedActivity

私は adb shell dumpsys window | findstr mCurrentFocusで大丈夫でした。

Pythonコーディング

上記 appPackage / appActivity情報とAppium InspectorのRecording機能を使って記録したコードを元にYoutube
アプリを起動→Mrs.GreenAppleを検索→Mrs.GreenAppleのチャンネル登録
のコードは次のようになりました。

Python
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('メッセージ', 'チャンネル登録完了!!')

1行目,2行目は実行時にうまく認識してくれなかったので、pathを追加しています。

各要素をクリックした後、画面の遷移が追いつかない事が想定されましたので、time.sleep(3)で待機を入れています。これぐらいの操作であれば、そこまでタイムロスはありませんが、処理が増えるとロスが増えます。

そこで要素表示されるまでは待機、要素が確認できればクリックという仕様に変更するため、WebDriverWaitを使うよう変更をします。

変更後

Python
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配布しているサイトもあるのですが、未知のサイトからファイルをダウンロードするのは気が引ける性格なので、スマホから取得する手順にしています。

STEP
apkファイルのファイル名の確認

スマホから取得する前にapkファイル名がわからないと検索しようがないので、公式のGoogle Playストアで確認します。

公式のGoogle Playストアへアクセス
②検索で自動操作したいアプリを検索します。ここではYoutubeのapkファイル取得を目指します。

search youtube in googleplay site image1

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

search youtube in googleplay site image2

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

search youtube in googleplay site image3
STEP
apkファイルの確認

①PCとスマホをデータ通信可のUSBケーブルでつなぎます。
②コマンドプロンプトでadb devicesと入力し、接続されていることを確認します。
③コマンドプロンプトで以下を実行し、保存先のファイルパスを取得します。
(com.google.android.youtubeの箇所は所望のアプリファイル名にしてください。)

PowerShell
adb shell pm list packages -f | findstr "com.google.android.youtube"
STEP
apkファイルのコピーと取得

④上記工程でファイルパスが返ってくるので、apkファイルをアクセス権がある場所にコピーします。私が上記でyoutubeのapkファイルを検索すると以下が返ってきました。

PowerShell
/data/app/~~TXSD3DK-2lKrJbLgWkhhIQ==/com.google.android.youtube-RsmfsM9xityPgnsJ-Jq9Mw==/base.apk=com.google.android.youtube

Android7.0以降では必要な対応になります。ここではアクセス権がある/storage/emulated/0/Downloadにコピーします。コマンドプロンプトで以下のコマンドを実行します。③で返ってきたファイルパスのうち
base.apkまでの箇所をコマンドに入力し、実行します。

PowerShell
adb shell cp /data/app/~~TXSD3DK-2lKrJbLgWkhhIQ==/com.google.android.youtube-RsmfsM9xityPgnsJ-Jq9Mw==/base.apk /storage/emulated/0/Download


⑤アクセス権がある場所にコピーされます。スマホのDownloadフォルダに保存されているので、PC
からスマホにアクセスすると、スマホのダウンロードフォルダにbase.apkファイルが保存されています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次