2018年9月30日 星期日

03-連線吧!Monkeyrunner (MonkeyRunner.waitForConnection)

よし,開發環境已經準備好了,執行方法也已經知道,接下來就開始學習 monkeyrunner API 吧!

本喵最開始要介紹的當然就是所有測試前都必須做的——裝置連線:MonkeyRunner.waitForConnection (float timeout, string deviceId)

MonkeyRunner.waitForConnection() 的作用就是讓手機或模擬器與 monkeyrunner 後端連線,這樣才能藉由腳本傳輸命令控制 Android 裝置。

參數:
timeout 單位是秒,表示允許等待的最長時間以讓裝置和 monkeyrunner 連線。若無填寫,表示會一直等待直到連線成功為止;若無可連線裝置,monkeyrunner 便會等到海枯石爛,至死不渝。
deviceId 一個能代表裝置的 serial number 的正規表示式。

第 1 個參數 timeout 相信看官們不會有什麼理解上的問題,有疑惑的可能是第 2 個參數 deviceId。首先咱們要知道什麼是裝置的 serial number,請打開萬能的命令提示字元,並在裡面輸入 adb devices,結果可能如下:
C:\Users\username>adb devices
List of devices attached
0123456789A    device
0123456789B    device
0123456789C    offline

上面的結果顯示現在和電腦接在一起的 Android 實體裝置有三個,其中可以連線到 adb server 的有兩個:0123456789A 和 0123456789B,這也暗示著這兩個裝置可以用 MonkeyRunner.waitForConnection() 與 monkeyrunner 的後端連接。而最後一個裝置 0123456789C 雖然也接在電腦上,但無法和 adb server 溝通,亦無法以 MonkeyRunner.waitForConnection() 連接。通常遇到這種 offline 狀態的時候就是重新插拔 USB 線,或是將 Android 裝置與電腦重新開機,或者在命令提示字元下依序執行 adb kill-serveradb start-serveradb remount。而像 0123456789A、0123456789B 和 0123456789C 這種字串就是 serial number,必須注意的是,serial number 的長度並沒有固定,也就是長度可能是 10,也可能是 16 不等,端看廠家怎麼編號。

知道 serial number 怎麼取得後,咱們就能說明 MonkeyRunner.waitForConnection() 怎麼使用了:
裝置數量 用法
1 MonkeyRunner.waitForConnection()

說明:
一直等到裝置與 monkeyrunner 連線為止
1 MonkeyRunner.waitForConnection(<timeout>)

Ex. 10 秒內若連不上任何裝置就返回:
MonkeyRunner.waitForConnection(10)
2 以上 MonkeyRunner.waitForConnection(deviceId=<deviceId>)

Ex. 一直等到與 0123456789B 連線上為止:
MonkeyRunner.waitForConnection(deviceId='0123456789B')
2 以上 MonkeyRunner.waitForConnection(<timeout>, <deviceId>)

Ex. 30 秒內若連不上 0123456789C 就返回:
MonkeyRunner.waitForConnection(30, '0123456789C')
2 以上 MonkeyRunner.waitForConnection(<timeout>)

Ex. 15 秒內若連不上任何裝置就返回:
MonkeyRunner.waitForConnection(15)

請注意:
上例等待連線的裝置並不一定是 adb devices 傳回的第一個裝置,端看 monkeyrunner 內部怎麼查找裝置
2 以上 MonkeyRunner.waitForConnection()

說明:
一直等到裝置與 monkeyrunner 連線為止

請注意:
上例等待連線的裝置並不一定是 adb devices 傳回的第一個裝置,端看 monkeyrunner 內部怎麼查找裝置

由上表可知,當電腦接有兩個以上的 Android 裝置時,最好指定可表示唯一的 deviceId 給 MonkeyRunner.waitForConnection(),否則將無法保證其連上的是預期的裝置。為什麼說指定可表示唯一的 deviceId 呢?看官們是否還記得參數表格內說 deviceId 是一個能代表裝置的 serial number 的正規表示式?比如 0123456789A0123456789B0123456789C 這三個 serial numbers 在正規表示式裡都可表示為 0123456789\w,若現在連上電腦的這三個裝置都可與 adb server 連線,在呼叫 MonkeyRunner.waitForConnection(deviceId=r'0123456789\w') 後,monkeyrunner 到底會連上誰呢?除了非常清楚 monkeyrunner 和 Android 系統的大大們外,大概很難回答這個問題吧。所以各位看官在使用 MonkeyRunner.waitForConnection() 時,請為 deviceId 指定一個唯一的表達式,當然若電腦只接一個 Android 裝置的話,就不用指定 deviceId 了。

沒有留言:

張貼留言