2018年11月4日 星期日

15-輕量級的輸入模擬 (input)

相比於 MonkeyDevice 提供的 press、touch 和 drag 三種方法,本喵更常使用 shell 提供的 input 來執行對應的動作。其實若單以行為的可控制性來說,MonkeyDevice 是勝過 shell input 的,比如 shell input tap 只能執行「點一下螢幕」這樣的動作,而 MonkeyDevice.touch() 還可以模擬「長壓螢幕」的行為。但之所以選擇 shell input,是因為 monkeyrunner 太常丟出 exception 了,雖然這可以藉由良好的封裝來重複嘗試執行,但設計上畢竟較繁複,執行測試時也會花費更多時間在不必要的 try...exception 上;另一個理由則是本喵被分配的工作剛好 shell input 便足夠勝任了,所以除非有必要,否則本喵是傾向使用簡單的方式來達成目的。

本喵常用的語法如下:
語法 說明
input
列出裝置支援的動作。其實本喵遇過雖列出支援 swipe,但實際上沒作用的裝置,最後還是只能使用 MonkeyDevice.drag() 的情況,所以在使用希望的功能時,儘量在目標平台上多試驗其可行性,畢竟 input 所支援的行為和平台版本相關。
input keyevent [--longpress] <key code number or name>
與 MonkeyDevice.press(<key name>, MonkeyDevice.DOWN_AND_UP) 的行為類似,但支援以 key code number 來指定按鍵類型。
另外 --longpress 這個參數實際上沒作用,本喵會在 16-input三兄弟keyevent 中解釋其原因。
input tap <x> <y>
與 MonkeyDevice.touch(<x>, <y>, MonkeyDevice.DOWN_AND_UP) 的行為類似,本喵會在 17-input三兄弟tap 中示範其用法。
input swipe <x1> <y1> <x2> <y2> [duration(ms)]
與 MonkeyDevice.drag( (<x1>, <y1>), (<x2>, <y2>) ) 的行為類似,本喵會在 18-input三兄弟swipe 中說明。

有一點需特別注意:
本喵通常不會以 MonkeyDevice.shell() 來執行 shell 指令,而是利用 Python 的 os.system()subprocess.Popen() 來呼叫 shell,理由在 14-繞遠路雖愚蠢但有用 (screencap) 也有提及,那就是 MonkeyDevice.shell() 可能產生莫名的 exception,這種奇妙的 exception 在 16-input三兄弟keyevent 中便有一例。

大概各位看官會對本喵ㄧ直沒正面回答這個奇妙的 exception 是怎回事而不滿吧!請稍安勿躁!本喵會在下回解釋這個神奇的 exception 是怎回事,以及解法的~~喵~

沒有留言:

張貼留言