Mac 上使用 Shell 腳本 + adb shell 實現簡單的 Android 模擬點擊自動化測試

需求

在 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"
簡單的交互.png

定義變量

直接使用 變量名=值 方式定義。要注意變量名和值與 = 號中間不要有空格,且變量命名要符合規范:

  • 首個字符必須為字母(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

參考

自己動手開發安卓版按鍵精靈

Shell 腳本語法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容