基礎自動化

本章節為您描述 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

備註

version、secure 等欄位以 d.server_info() 實際輸出為準。未啟用 服務憑證 時,secure 通常為 false。

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

螢幕熄滅

以下介面會使目前手機螢幕熄滅,相當於您在螢幕亮起時按一下電源鍵的效果。

d.sleep()

螢幕亮起

以下介面會使目前手機螢幕亮起,相當於您在螢幕熄滅時按一下電源鍵的效果。

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_BACK、KEY_DOWN、KEY_HOME 等十多種按鍵。

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 來定義,它包含四個參數 top、left、right、bottom。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 個像素,left 和 right 代表從 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")

點擊螢幕上的某個點

您可以透過下列介面來模擬點擊螢幕,點擊螢幕上座標為 (100, 100) 的點。

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

長按螢幕上的某個點

您可以透過下列介面來模擬長按螢幕,按住螢幕上座標為 (100, 100) 的點,並在三秒後放開。

d.long_click(Point(x=100, y=100), timeout=1000*3) # 3s,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)。下面的示範中只滑動了三個點,實際上您可以提供更多點位,甚至實現九宮格解鎖。

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)
您已处于开发者模式,无需进行此操作。