需求

在 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 来调试点击的坐标点是否符合我们的期望。

不同机型分辨率不同,坐标点位置肯定是不一样的。比较理想的结果应该是我们输入固定的坐标点,然后代码里自动获取机型的屏幕密度等信息并自动转换。这里为了快速开发出这个小功能,就简单使用了最耿直的不同机型设置不同坐标的方法 ╮(╯▽╰)╭。

所以单步实现上述需求的命令就是:

  1. adb shell input tap 200 300 //点击(200,300)坐标点(假设该点就是跳转按钮所在位置)
  2. adb shell input keyevent 4 //点击退出,弹出是否确认退出 Dialog
  3. adb shell input tap 500 600 //点击(500,600)坐标点(假设该点就是确认退出按钮所在位置)

一次模拟进出界面的测试就完成了。

自动化

在命令行窗口输入命令便可实现单步操作,那想要自动化实现整个流程自然就是要做到自动输入命令。Shell 脚本可以实现这样的功能。后面要做的就简单了:确定需要实现的功能 --> 学习相应的 Shell 脚本语法 --> 编写脚本。

需要的功能

Shell 脚本的第一行必须为 #!/bin/bash。使用命令:sh 脚本名.sh 运行脚本。

打印 log(时间、循环次数等)

echo 在命令行输出一段日志。例如 echo "Hello World"

打印当前时间:

  1. time=$(date +%m-%d--%H:%M:%S)`
  2. echo "时间:$time

简单的交互

例如输入不同机型代号。read phoneModel 该语句会将用户的输入存储在 phoneModel 变量中,再根据变量做判断处理。使用变量在变量名前加 $ 符号即可。例如:

  1. echo "What's your name?"
  2. read myName
  3. echo "Hi, $myName"

定义变量

直接使用 变量名=值 方式定义。要注意变量名和值与 = 号中间不要有空格,且变量命名要符合规范:

  • 首个字符必须为字母(a-z,A-Z)
  • 中间不能有空格,可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

if else 判断

  1. echo "What's your name?"
  2. read myName
  3. if [ "$myName" = "yazhi" ];then
  4. echo "I know you!"
  5. else
  6. echo "Nice to see you!"
  7. fi

这里要注意 [] 符号前后的空格,少了空格会提示语法错误,语句最后要跟 fi

休眠(业务是耗时的)

sleep 5 :休眠5秒

While 循环

  1. while [ "1" = "1" ] #死循环
  2. do
  3. echo "do something"
  4. done

基本用得到的语法就上述这些,最后贴一下我的脚本:

  1. #!/bin/bash
  2. echo "开始自动化进出教室"
  3. quitTime=10
  4. echo "课程数据量是否很大?(y/n)"
  5. read waitTime
  6. if [ "$waitTime" = "y" ];then
  7. quitTime=25 #数据量多的课程
  8. elif [ "$waitTime" = "n" ]; then
  9. quitTime=10 #数据量少的课程
  10. else
  11. echo "输入错误"
  12. exit 0
  13. fi
  14. enterRoomX=0 #进入教室按钮坐标
  15. enterRoomY=0
  16. quitRoomX=0 #确认退出按钮坐标
  17. quitRoomY=0
  18. echo "选择机型:1(华为M2平板),2(小米平板2),3(Nexus5),4(红米2A)"
  19. read phone
  20. if [ "$phone" = "1" ];then
  21. echo "当前选中机型:华为M2平板"
  22. enterRoomX=400
  23. enterRoomY=500
  24. quitRoomX=1300
  25. quitRoomY=610
  26. elif [ "$phone" = "2" ];then
  27. echo "当前选中机型:小米平板2"
  28. enterRoomX=400
  29. enterRoomY=640
  30. quitRoomX=1480
  31. quitRoomY=820
  32. elif [ "$phone" = "3" ];then
  33. echo "当前选中机型:Nexus5"
  34. enterRoomX=200
  35. enterRoomY=900
  36. quitRoomX=1200
  37. quitRoomY=610
  38. elif [ "$phone" = "4" ];then
  39. echo "当前选中机型:红米2A"
  40. enterRoomX=200
  41. enterRoomY=600
  42. quitRoomX=1000
  43. quitRoomY=410
  44. else
  45. echo "错误:未知机型"
  46. exit 0
  47. fi
  48. echo "开始自动化进出教室"
  49. num=1
  50. while [ "1" = "1" ] #死循环
  51. do
  52. time=$(date +%m-%d--%H:%M:%S)
  53. echo "时间:$time 第 $num 次进入教室"
  54. num=$(($num + 1))
  55. adb shell input tap $enterRoomX $enterRoomY #进入教室
  56. sleep $quitTime #进教室休眠时间
  57. adb shell input keyevent 4 #退出教室
  58. sleep 1
  59. adb shell input tap $quitRoomX $quitRoomY #退出教室确认
  60. sleep 4
  61. done

参考

自己动手开发安卓版按键精灵

Shell 脚本语法

Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试的更多相关文章

  1. shell脚本学习—Shell执行脚本

    Shell作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行这一条,这种方式称为交互式,但还有另一种执行命令的方式称为批处理方式,用户事先写一个Shell脚本,Shell可以一次把这些命 ...

  2. (十四)、shell脚本之shell基础(上)

    一.shell脚本介绍 1.使用脚本的原因 其中使用脚本的一个最主要的原因是因为一个字"懒",在处理自动循环或者大的任务方面可以偷懒且省时间,如果有处理一个任务的命令清单,一个任务 ...

  3. 【Shell 编程基础第一部分】第一个Shell脚本HelloShell及一些简单的Shell基础书写与概念;

    http://blog.csdn.net/xiaominghimi/article/details/7603000 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  4. gitlab webhook php exec 调用 shell 脚本。shell 脚本中调用 git pull 命令无法执行。

    情况如下: 我在ubuntu server 14.04 上面安装了gitlab,来托管项目代码.然后想通过gitlab的web hook 功能来做测试服务器代码自动化更新代码功能.现在遇到一个问题:就 ...

  5. Shell脚本之一 Shell脚本简介

    一.什么是shell? 我们平时所说的 Shell 可以理解为 Linux 系统提供给用户的使用界面.Shell 为用户提供了输入命令和参数并可得到命令执行结果的环境.当一个用户登录 Linux 之后 ...

  6. 分享7个shell脚本实例--shell脚本练习必备

    概述 看多shell脚本实例自然就会有shell脚本的编写思路了,所以我一般比较推荐看脚本实例来练习shell脚本.下面分享几个shell脚本实例. 1.监测Nginx访问日志502情况,并做相应动作 ...

  7. linux crontab定时任务运行shell脚本(shell执行sql文件)

    https://www.cnblogs.com/tiankongjava/p/6106743.html 今天做个linux定时任务(每晚12点把表汇总). 顺便写个博客记录一下~~ 为什么用linux ...

  8. shell脚本(2)-shell脚本语法

    一.如何抒写shell脚本 1.shell脚本的命名 名字要有意义,不要以a.b.c.1.2.3这种方式命令,建议以sh结尾,在30个字节内,例如:check_memory.sh  2.shell脚本 ...

  9. 【shell脚本】shell脚本实现的 函数差集查找

    文本地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. 问题背景 2. 代码实现 1.问题背景 在做公司的测试的自动化测试时,覆盖了一些开发代码的函数,但是那些还没有做,使用一个函 ...

随机推荐

  1. LaTeX相关自学文档

    install-latex-guide-zh-cn: lshort-zh-cn: 百度网盘链接:https://pan.baidu.com/s/1cBv9Fu8KFaf0QFZ7_slxmw 提取码: ...

  2. 通过自定义拦截器优雅的导出Excel并标红的重复数据

    平时我们导入导出Excel的时候如果用poi导出,会发现光设置格式都要很多代码,看起来非常的不优雅.后来业务中遇到了需要导入非常巨大的Excel的需求.如果继续用poi的方式,因为poi把所有exce ...

  3. 01_Activity生命周期及传递数据

    1. Activity的生命周期: 2. Activity启动另一个Activity,并传递数据: package com.example.activitydemo; import android.a ...

  4. Spring Cloud 学习 (八) Spring Boot Admin

    Spring Boot Admin 用于管理和监控一个或者多个 Spring Boot 程序 新建 spring-boot-admin-server pom <parent> <ar ...

  5. 5.1 Spring5源码--Spring AOP源码分析一

    目标: 1.什么是AOP, 什么是AspectJ, 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP 1.1 什么是 ...

  6. Python函数的关键字参数

    除了位置参数的函数参数使用方式,还有一种在函数调用时指定形参等于指定实参的参数使用模式,该模式称为关键字参数.关键字参数使用可以不按形参的顺序传递实参,系统按形参的名字确认实参传递给哪个参数. 具体内 ...

  7. vue props默认值国际化报错

    未做国际化处理 tabLabel: { type: Array, default: () => (["a", "b", "c"]) } ...

  8. js 转换为字符串方法

    要把一个值转换为一个字符串有两种方法:toString()方法和转型函数String(). toString()方法 数值.布尔值.对象.字符串值(每个字符串都有一个toString()方法,该方法返 ...

  9. Python(一) 快速配置Python编译环境与第一个py文件程序

    1. Python基本语法在此不熬述. 2. 到管网下载Python 3.6.x 版本,与本机匹配的版本,如本机是 win7 64 python-3.6.5-amd64 3. 下载IDE:Python ...

  10. 【C++】C++ new和malloc到底哪里不一样

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14118782.html 目录 一.前言 二.new和malloc两者的区别 2.1 属性的区别 2.2 使用上的 ...