需求
在 A 界面,點擊跳轉到 B 界面(該界面會執行一些業務),再點擊返回鍵出現 Dialog 彈窗,點擊確認退出按鈕,返回 A 界面。不斷循環。
思路
一開始想到的就是按鍵精靈,下了 mac 版使用后發現功能太不完善,于是試了試 Windows 版,實在是操作不習慣。在搜索資料過程中了解到還可以使用 adb 來實現模擬設備操作,那肯定是寫代碼更順手啊,配合使用腳本重復輸入命令,就能實現簡單的自動化重復操作了。
實現
模擬設備操作
常用的按鈕都有特定的 keyevent 代號,例如返回鍵代號4(其他按鍵可參考文末文章中介紹),模擬返回鍵的點擊只需要在命令行中輸入 adb shell input keyevent 4
即可。
模擬點擊屏幕中某點的命令是 adb shell input tap x y
,(x,y)是相應的坐標點,這就涉及到了對坐標點的計算。巧的是,正好之前寫了個涂鴉的 demo (Github 地址,App 下載地址),可以使用該 demo 來調試點擊的坐標點是否符合我們的期望。
不同機型分辨率不同,坐標點位置肯定是不一樣的。比較理想的結果應該是我們輸入固定的坐標點,然后代碼里自動獲取機型的屏幕密度等信息并自動轉換。這里為了快速開發出這個小功能,就簡單使用了最耿直的不同機型設置不同坐標的方法 ╮(╯▽╰)╭。
所以單步實現上述需求的命令就是:
adb shell input tap 200 300 //點擊(200,300)坐標點(假設該點就是跳轉按鈕所在位置)
adb shell input keyevent 4 //點擊退出,彈出是否確認退出 Dialog
adb shell input tap 500 600 //點擊(500,600)坐標點(假設該點就是確認退出按鈕所在位置)
一次模擬進出界面的測試就完成了。
自動化
在命令行窗口輸入命令便可實現單步操作,那想要自動化實現整個流程自然就是要做到自動輸入命令。Shell 腳本可以實現這樣的功能。后面要做的就簡單了:確定需要實現的功能 --> 學習相應的 Shell 腳本語法 --> 編寫腳本。
需要的功能
Shell 腳本的第一行必須為 #!/bin/bash
。使用命令:sh 腳本名.sh
運行腳本。
打印 log(時間、循環次數等)
echo
在命令行輸出一段日志。例如 echo "Hello World"
。
打印當前時間:
time=$(date +%m-%d--%H:%M:%S)`
echo "時間:$time
簡單的交互
例如輸入不同機型代號。read -p "What's your name?" myName
該語句會將用戶的輸入存儲在 myName
變量中,再根據變量做判斷處理。使用變量在變量名前加 $
符號即可。例如:
read -p "What's your name?" myName
echo "Hi, $myName"
定義變量
直接使用 變量名=值 方式定義。要注意變量名和值與 =
號中間不要有空格,且變量命名要符合規范:
- 首個字符必須為字母(a-z,A-Z)
- 中間不能有空格,可以使用下劃線(_)
- 不能使用標點符號
- 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)
if else 判斷
read -p "What's your name?" myName
if [ "$myName" = "yazhi" ];then
echo "I know you!"
else
echo "Nice to see you!"
fi
這里要注意 [
和]
符號前后的空格,少了空格會提示語法錯誤,語句最后要跟 fi
。
如果有多個條件:
if [ "$myName" = "yazhi" ] || [ ! -n "$myName" ];then //如果輸入了"yazhi",或者沒有輸入
...
休眠(業務是耗時的)
sleep 5
:休眠5秒
While 循環
while [ "1" = "1" ] #死循環
do
echo "do something"
done
重定向
echo "test">./content.txt //> 清空并添加
echo "test">>./content.txt //>> 追加
字符串 A 是否包含 字符串 B
if [[ "strA" != *"strB"* ]];then
echo "strA 中包含 strB"
else
echo "strA 中不包含 strB"
fi
獲取當前時間
currentTime=`date "+%Y-%m-%d_%H:%M:%S"`
echo ${currentTime} //輸出 2018-01-04_18:46:24
獲取命令返回值
branchName=`git rev-parse --abbrev-ref HEAD` //例如位于 master 分支
echo ${branchName} // master
基本用得到的語法就上述這些,最后貼一下我的腳本:
#!/bin/bash
echo "開始自動化進出教室"
quitTime=10
read -p "課程數據量是否很大?默認是(y/n) : " waitTime
if [ "$waitTime" = "y" ] || [ ! -n "$waitTime" ];then
quitTime=7 #數據量多的課程
echo "當前課程數據量較大"
elif [ "$waitTime" = "n" ]; then
quitTime=5 #數據量少的課程
echo "當前課程數據量較小"
else
echo "輸入錯誤"
exit 0
fi
enterRoomX=0 #進入教室按鈕坐標
enterRoomY=0
quitRoomX=0 #確認退出按鈕坐標
quitRoomY=0
read -p "選擇機型:1(華為M2平板),2(小米平板2),3(Nexus5),4(紅米2A) 默認2 :" phone
if [ "$phone" = "1" ] || [ ! -n "$phone" ];then
echo "當前選中機型:華為M2平板"
enterRoomX=400
enterRoomY=500
quitRoomX=1300
quitRoomY=610
elif [ "$phone" = "2" ];then
echo "當前選中機型:小米平板2"
enterRoomX=400
enterRoomY=640
quitRoomX=1480
quitRoomY=820
elif [ "$phone" = "3" ];then
echo "當前選中機型:Nexus5"
enterRoomX=200
enterRoomY=900
quitRoomX=1200
quitRoomY=610
elif [ "$phone" = "4" ];then
echo "當前選中機型:紅米2A"
enterRoomX=200
enterRoomY=600
quitRoomX=1000
quitRoomY=410
else
echo "錯誤:未知機型"
exit 0
fi
read -p "是否測試學生端進入教室?默認是(y/n) :" isStudent
if [ "$isStudent" = "y" ] || [ ! -n "$isStudent" ];then
echo "即將測試學生端"
elif [ "$isStudent" = "n" ];then
enterRoomX=$(($enterRoomX + 400)) #數據量少的課程、
echo "即將測試旁聽端"
else
echo "輸入錯誤"
exit 0
fi
echo "開始自動化進出教室"
num=1
while [ "1" = "1" ] #死循環
do
time=$(date +%m-%d--%H:%M:%S)
echo "時間:$time 第 $num 次進入教室"
num=$(($num + 1))
adb shell input tap $enterRoomX $enterRoomY #進入教室
sleep $quitTime #進教室休眠時間
adb shell input keyevent 4 #退出教室
sleep 1
adb shell input tap $quitRoomX $quitRoomY #退出教室確認
sleep 4
done