在 A 界面,点击跳转到 B 界面(该界面会执行一些业务),再点击返回键出现 Dialog 弹窗,点击确认退出按钮,返回 A 界面。不断循环。
一开始想到的就是按键精灵,下了 mac 版使用后发现功能太不完善,于是试了试 Windows 版,实在是操作不习惯。在搜索资料过程中了解到还可以使用 adb 来实现模拟设备操作,那肯定是写代码更顺手啊,配合使用脚本重复输入命令,就能实现简单的自动化重复操作了。
常用的按钮都有特定的 keyevent 代号,例如返回键代号 4(其他按键可参考文末文章中介绍),模拟返回键的点击只需要在命令行中输入
即可。
- adb shell input keyevent 4
模拟点击屏幕中某点的命令是
,(x,y) 是相应的坐标点,这就涉及到了对坐标点的计算。巧的是,正好之前写了个涂鸦的 demo ( Github 地址 , App 下载地址 ),可以使用该 demo 来调试点击的坐标点是否符合我们的期望。
- adb shell input tap x y
不同机型分辨率不同,坐标点位置肯定是不一样的。比较理想的结果应该是我们输入固定的坐标点,然后代码里自动获取机型的屏幕密度等信息并自动转换。这里为了快速开发出这个小功能,就简单使用了最耿直的不同机型设置不同坐标的方法 ╮(╯▽╰)╭。
所以单步实现上述需求的命令就是:
- 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
在命令行输出一段日志。例如
- 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"
直接使用 变量名 = 值 方式定义。要注意变量名和值与
号中间不要有空格,且变量命名要符合规范:
- =
####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",或者没有输入
- ...
:休眠 5 秒
- sleep 5
- while [ "1" = "1" ] #死循环
- do
- echo "do something"
- done
基本用得到的语法就上述这些,最后贴一下我的脚本:
- #!/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
来源: https://juejin.im/post/5a36916cf265da43052eb502