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 脚本语法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容