基本自動化

本章では、FIRERPA が提供する自動化の基本機能について説明します。さらに高度な機能については後続の章で説明します。本章では、よく使われる基本的な機能インターフェースを紹介します。

デバイス情報の取得

現在のデバイス情報(デバイス名、画面サイズ、画面の向き、現在のアプリなど)を取得します。

d.device_info()
>>> d.device_info()
productName: "bumblebee"
sdkInt: 34
displayHeight: 2400
displaySizeDpX: 411
displaySizeDpY: 914
displayWidth: 1080
screenOn: true
naturalOrientation: true
currentPackageName: "com.android.launcher3"
>>> result = d.device_info()
>>> print (result.displayWidth)
1080

サービス情報の取得

現在のサービスのバージョン、デバイス固有ID、ABIなどの情報を取得します。

d.server_info()
>>> d.server_info()
uniqueId: "673abbe0-ff7b-9d82-1792-8876cb72cf56"
version: "9.25"
architecture: "arm64-v8a"
uptime: 293
secure: false

注釈

versionsecure などのフィールドは、d.server_info() の実際の出力に準じます。サービス証明書 を有効にしていない場合、secure は通常 false になります。

>>> result = d.server_info()
>>> print (result.secure)
False

画面をオフにする

以下のインターフェースは、現在のスマートフォンの画面をオフにします。画面が点灯している状態で電源キーを1回押した場合と同じ効果です。

d.sleep()

画面をオンにする

以下のインターフェースは、現在のスマートフォンの画面を点灯させます。画面がオフの状態で電源キーを1回押した場合と同じ効果です。

d.wake_up()

画面が点灯しているかどうか

以下のインターフェースで、現在のデバイスの画面が点灯しているかどうかを確認できます。操作可能かどうかの判断に使用します。

d.is_screen_on()

画面がロックされているかどうか

以下のインターフェースで、現在のデバイスの画面がロック状態にあるかどうかを確認できます。操作可能かどうかの判断に使用します。

d.is_screen_locked()

Toast を表示する

以下のインターフェースを使用すると、スマートフォンの画面上に Hello from Lamda! という Toast メッセージを表示できます。

d.show_toast("Hello from Lamda!")

クリップボードの読み取り

以下のインターフェースは、スマートフォンの現在のクリップボードの内容を読み取るために使用します。現時点では Android 10 以降はサポートされていません。

d.get_clipboard()

クリップボードへの書き込み

以下のインターフェースは、現在のデバイスのクリップボードに内容を書き込むために使用します。

d.set_clipboard("クリップボードの内容")

物理キー

以下のメソッドを使用してキー操作をシミュレートできます。KEY_BACKKEY_DOWNKEY_HOME など10種類以上のキーをサポートしています。

d.press_key(Keys.KEY_BACK)
d.press_key(Keys.KEY_CAMERA)
d.press_key(Keys.KEY_CENTER)
d.press_key(Keys.KEY_DELETE)
d.press_key(Keys.KEY_DOWN)
d.press_key(Keys.KEY_ENTER)
d.press_key(Keys.KEY_HOME)
d.press_key(Keys.KEY_LEFT)
d.press_key(Keys.KEY_MENU)
d.press_key(Keys.KEY_POWER)
d.press_key(Keys.KEY_RECENT)
d.press_key(Keys.KEY_RIGHT)
d.press_key(Keys.KEY_SEARCH)
d.press_key(Keys.KEY_UP)
d.press_key(Keys.KEY_VOLUME_DOWN)
d.press_key(Keys.KEY_VOLUME_MUTE)
d.press_key(Keys.KEY_VOLUME_UP)

また、その他のより多くのキーをサポートするために、このメソッドを使用してシミュレートすることもできます。すべてのサポート対象のキー名は、Android 公式ドキュメントで確認できます:https://developer.android.com/reference/android/view/KeyEvent

d.press_keycode(KeyCodes.KEYCODE_CALL)

スクリーンショット

スクリーンショットを撮るメソッドを提供しています。これにより、操作手順を記録したり、画像認識を行ったりできます。以下の例は、品質 60 で画像を撮影し、現在のディレクトリに screenshot.png ファイルとして保存する方法を示しています。

d.screenshot(60).save("screenshot.png")
>>> result = d.screenshot(60)
>>> result
<lamda.types.BytesIO object at 0x7a28361d60>
>>> result.save("screenshot.png")
52917
>>> result.getvalue()
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01....'

現在、領域スクリーンショットと要素スクリーンショットもサポートしています。要素スクリーンショットについては本章では説明しません。ここでは領域スクリーンショットを紹介します。領域の概念と定義を理解する必要があります。私たちのインターフェースでは、領域は Bound で定義され、topleftrightbottom の4つのパラメータを含みます。Android の画面は通常の座標系とは異なり、現在のデバイス画面の左上隅が原点で、座標は x=0, y=0 です。現在の画面が縦向きで解像度が 1080×1920 だと仮定します。全画面の領域スクリーンショットを撮りたい場合は、次のようにします:

d.screenshot(60, bound=Bound(top=0, left=0, right=1080, bottom=1920)).save("screenshot.png")

これにより全画面スクリーンショットが生成されます。もちろん、デフォルトが全画面スクリーンショットであるため、これは必要ありません。では、左上隅に位置する 200×200 の画像を撮りたい場合はどうすればよいでしょうか。これも簡単です。以下のように操作するだけです:

d.screenshot(60, bound=Bound(top=0, left=0, right=200, bottom=200)).save("screenshot.png")

ここで、これらのパラメータの意味を説明します。top は Y 軸に沿って下方向に top ピクセルずらすことを表し、bottom は Y 軸に沿って下方向に bottom ピクセルずらすことを表します。leftright は X 軸に沿って右方向にずらすピクセル数を表します。なお、top は常に bottom より小さく、left は常に right より小さくなります。次に別の例を示します。画面の右下隅の 200×200 の画像を撮るには、以下のようにインターフェースを呼び出すだけです:

d.screenshot(60, bound=Bound(top=1920-200, bottom=1920, left=1080-200, right=1080)).save("screenshot.png")

画面上の1点をタップする

以下のインターフェースで画面のタップをシミュレートできます。画面上の座標 (100, 100) の点をタップします。

d.click(Point(x=100, y=100))

画面上の1点を長押しする

以下のインターフェースで画面の長押しをシミュレートできます。画面上の座標 (100, 100) の点を押し、3秒後に離します。

d.long_click(Point(x=100, y=100), timeout=1000*3) # 3秒。0 の場合はデフォルトの長さになります

点Aをタップして点Bへドラッグする

以下のインターフェースで、点 A にあるオブジェクトを点 B までドラッグできます。たとえば、アイコンをフォルダーにドラッグするなどの操作に使用します。

A = Point(x=100, y=100)
B = Point(x=500, y=500)

d.drag(A, B)

点Aから点Bへスワイプする

以下のインターフェースで、画面座標 (100, 100) から (500, 500) までスワイプできます。

A = Point(x=100, y=100)
B = Point(x=500, y=500)

d.swipe(A, B)

やや複雑なマルチポイントスワイプ

以下のインターフェースでマルチポイントスワイプをシミュレートできます。たとえば、以下の呼び出しでは、(100, 100) から (500, 500) へスワイプし、さらに (200, 200) へ戻ります。以下のデモでは3点のみをスワイプしていますが、実際にはさらに多くのポイントを指定でき、パターンロック解除も実現できます。

p1 = Point(x=100, y=100)
p2 = Point(x=500, y=500)
p3 = Point(x=200, y=200)

d.swipe_points(p1, p2, p3)

クイック設定を開く

以下の呼び出しでクイック設定パネルを開くことができます。ただし、半分だけ展開されます(半開状態)。

d.open_quick_settings()

通知バーを開く

以下の呼び出しで画面上の通知バーを開くことができます。

d.open_notification()

ページレイアウトの取得

以下の呼び出しで現在のページの XML レイアウトを取得できます。これを自分で解析して xpath による自動化をサポートすることもできます。

d.dump_window_hierarchy()
>>> result = d.dump_window_hierarchy()
>>> result
<lamda.types.BytesIO object at 0x7add660680>
>>> result.getvalue()
b'<?xml version=\'1.0\' encoding=\'UTF-8\' standalone=\'yes\' ?>\r\n<hierarchy rotation="0">\r\n  <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false"...

ウィンドウが静止するまで待機する

以下の呼び出しを実行すると、現在のウィンドウが静止状態になるまで待機できます。Selenium の implicitly_wait に似ています。パラメータの単位はミリ秒で、5*1000 は 5000 ミリ秒(つまり5秒)待機することを表します。

d.wait_for_idle(5*1000)

最近の Toast を取得する

以下の呼び出しを実行すると、システム内の最新の Toast メッセージを取得できます。ただし、システム API を通じて送信された Toast メッセージのみがサポートされており、サードパーティが実装した Toast 風の UI メッセージは取得できません。

d.get_last_toast()
>>> result = d.get_last_toast()
>>> print (result)
timestamp: 1700000000000
package: "com.android.settings"
message: "\346\202\250\345\267\262\345\244\204\344\272\216\345\274\200\345\217\221\350\200\205\346\250\241\345\274\217\357\274\214\346\227\240\351\234\200\350\277\233\350\241\214\346\255\244\346\223\215\344\275\234\343\200\202"
>>> print (result.message)
您已处于开发者模式,无需进行此操作。