基礎自動化¶
本章節為您描述 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))
點按點 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)
您已處於開發者模式,無需進行此操作。