简介

Appium是一个开源的,适用于原生或混合移动应用( hybrid mobile apps )的自动化测试工具,Appium应用WebDriver: JSON wire protocol驱动安卓和iOS移动应用。Appium选择了Client/Server的设计模式。只要client能够发送http请求给server,那么的话client用什么语言来实现都是可以的,这就是如何做到支持多语言的原因;

参考资料

  • 需要安装的环境和程序:==adb== ==Appium== ==jdk==

Android

adb环境

windows安装

  • 前置:电脑已==安装手机驱动==,==usb==调试模式已打开(开发者选项和usb模拟点击根据情况后面会需要打开)
  • 1.下载安装包(32/64位),解压到非中文路径且路径名无特殊字符
  • 2.配置系统环境变量和 path 路径

配置系统变量

配置环境变量path路径

mac安装

下载cmdline-tools

  • 下载cmdline-tools cmdline-tools的作用是通过命令行去控制下载 SDK 工具包如:platform-tools tools build-tool 等
  • 创建目录:/Users/ada/Library/Android/sdk/cmdline-tools/latest 存放下载的 cmdline-tools
  • 下载链接:https://developer.android.google.cn/studio?hl=zh_cn (页面滑动往下面拉一点找下)

下载cmdline-tools

文件解压

  • 默认情况下sdk同级的其它文件都是没有的,我这边是因为后面下载了工具包所以截图里面有

文件夹创建和解压

sdkmanager 命令行操作

  • 由于没有配置全局环境,需要先切换到bin目录 执行./sdkmanager
1
2
3
4
# 切换路径
cd /Users/ada/Library/Android/sdk/cmdline-tools/latest/bin
# 包管理查看
./sdkmanager --list

sdkmanager --list

安装包

1
2
3
4
5
6
7
8
9
10
11
#安装软件包
sdkmanager packages [options] #官方示例 sdkmanager 包名 可选参数
#例如,下面展示了如何安装最新的平台工具(包括 adb 和 fastboot)以及适用于 API 级别 28 的 SDK 工具:
sdkmanager "platform-tools" "platforms;android-28" # 这个是官方的示例,根据意思如果不加;号指定版本就是最新的,多个包用空格隔开,用""括起来
#下载build-tools指定版本
sdkmanager "build-tools;30.0.2"
#卸载软件包
sdkmanager --uninstall packages [options]
sdkmanager --uninstall --package_file=package_file [options]
#更新已安装的软件包
sdkmanager --update [options]

下载包

下载包

环境配置

  • 配置==系统环境变量==
    • 注意上面的高亮,是配置系统环境变量,和windows一样有用户变量,只对当前用户有效,系统变量对所有用户有效,Appium在启动后只认系统变量如果设置的是用户变量到时候可能一直提示你没有设置 ==JAVA_HOME== ==ANDROID_HOME==
    • 在Macx系统中 ==/etc/profile== 是系统变量配置文件 ==~/.bash_profile== 是用户变量
    • 在编辑 /etc/profile 文件的时候如果提示没有权限,那么找到 /etc 文件夹和 profile 文件添加用户的读写权限 修改这种配置文件记得先备份,养成良好的习惯

添加文件编辑权限

  • Mac配置系统变量 ==Android_HOME== ==JAVA_HOME==(再提示一遍是系统变量)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#步骤一: 打开系统变量配置文件 和 ~/.zshrc文件
open -e /etc/profile
open -e ~/.zshrc
# 步骤二:添加配置(/etc/profile文件)保存
# Java系统变量
export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=$JAVA_HOME/lib

# Android系统变量
AAPT_HOME=/Users/ada/Library/Android/sdk/build-tools/30.0.2/
export AAPT_HOME
export PATH=$PATH:$AAPT_HOME

ANDROID_HOME=/Users/ada/Library/Android/sdk
export PATH=$ANDROID_HOME/tools:$PATH
export PATH=$ANDROID_HOME/tools/bin:$PATH
export PATH=$ANDROID_HOME/platform-tools:$PATH
export PATH=$ANDROID_HOME/build-tools/30.0.2:$PATH
export PATH=$ANDROID_HOME/emulator:$PATH
export ANDROID_HOME

export ANDROID_SDK_ROOT=/Users/ada/Library/Android/sdk
export PATH=$ANDROID_SDK_ROOT/emulator:$ANDROID_SDK_ROOT/tools:$PATH
# 步骤三:添加配置(~/.zshrc文件)保存
source /etc/profile
source ~/.bash_profile
#步骤四:source 生效一下
source /etc/profile
source ~/.zshrc

配置Java、Android系统变量

adb环境验证

  • 在cmd、终端输入 ==adb version==查看是否安装成功
1
2
3
4
#查看adb的版本
adb version
#查看设备连接
adb devices

adb版本查看

Appium启动验证

Appium启动验证

uiautomatorviewer启动校验

  • uiautomatorviewer 是 adb 工具包里面的一个元素探测工具,用于定位识别元素为后期自动化ui元素定位提供基础数据

启动uiautomatorviewer

adb常用命令

基础命令

查看当前版本

1
2
#查看当前的 adb 版本 (这个版本好像低于38 39还是哪个版本以下的如果执行键盘输入中文到app输入框会有乱码现象,之前用DeskDock键盘输入)
adb version

查看adb版本

设备检查及输入

1
2
3
4
5
6
7
#查看adb的帮助手册
adb --help
# 检查连接到电脑的安卓设备
adb devices
#如果有检测到可以验证一下:模拟点击手机返回的命令,手机会模拟返回按键操作,有反应代表连接正常
adb shell input keyevent
#状态 device 在线   offline 离线 unauthorized 未授权 List of devices attached  未检测到

检测设备

连接模拟器

1
2
#有时候没有真机,或者真机的版本太高不好获得root权限可以采用模拟器 推荐模拟器【夜神、雷电模拟器】
adb connect 127.0.0.1:62001 #(先把模拟器打开),127.0.0.1指的使用本机,62001是夜神模拟器的端口号,根据你的模拟器端口可能会有变化

连接到模拟器

设备操作

进入设备终端

1
2
3
4
#进入到设备的终端控制台 就像xshell连接服务器一样,andriod底层是基于linux的,需要连接,然后也可以用linux命令
adb shell
#退出终端 当需要回退到cmd窗口进行adb命令操作时
exit 或者 adb shell

从手机中拉取文件至本地

1
2
#将手机中的文件拉取到你自己的电脑本地,一般会用于日志的拉取或者tcpdump对网卡的抓包信息
adb pull <手机路径,源文件> <本机路径,目标文件>

拉取文件

上传文件

1
2
3
#将本地的文件上传/推送到设备中 
adb push <本机路径,源文件> <手机路径,目标路径> /新命名文件
#这里有个小窍门,就是push后面本地文件,可以直接找到拖进去,不用手动输本地路径,可以重复推送,自动覆盖

上传文件

手机日志

1
2
3
4
5
6
7
8
#清理main缓存区域的日志
adb logcat -c
#清理系统事件信息日志
adb logcat -c -b events
#清理手机内所有日志的命令(如果手机之前的日志不需要了一般用这个)
adb logcat -c -b main -b events -b radio -b system
#拉取日志 这里本地路径必须是一个目录,前面是大于符号重定向,后面要给拉取的日志取一个别名,不然拉取会失败,日志是动态的,所以估计3-5秒拉取完成后用ctrl+c/z/x 结束根据电脑快捷键决定
adb logcat > <本地路径> 命名日志名.txt

指令

1
2
3
4
5
6
7
8
9
10
11
12
#可以通过adb输入一些指令,让设备做对应的动作,比如模拟我们的滑动,截屏,输入等等
#截屏
adb shell screencap -p 文件输出路径/fileName.png
adb shell screencap -p /sdcard/01.png #截屏并保存在/sdcard/01.png这个路径
#录屏
adb shell screenrecord /sdcard/fileName.mp4     #ctrl+c结束 --size 设置分辨率  --bit-rate 指定比特率  --rotate  旋转90°
#模拟点击返回按钮
adb shell input keyevent
#模拟手势滑动点击(实现微信跳一跳高分核心方法)
adb shell input touchscreen swipe x1 y1 x2 y2 time #(x1,y1):起始点击点的x y位置 (x2,y2):终止点击点的x位置 time:操作耗时毫秒数
# 单击屏幕屏幕(点击)
adb shell input tap X坐标 Y坐标

包管理

安装/卸载APP

1
2
3
4
5
6
7
8
#和上传一样可以直接拖,注意格式是apk的文件(手机usb模式换成文件传输,不能为充电模式),成功后会提示success    提示:adb: failed to install,表示有安装过同名的包,可以采用下面的覆盖安装
adb install <安装包路径>
#覆盖安装
adb install -r <安装包路径>
#静默安装 这个不会,据说在比较老的Android版本中支持,它的作用就是安装后同时赋予默认的权限,在自动化测试时候如果监测到没有安装对应的APP那么可以采用尝试,静默安装

#卸载 提示success,代表成功
adb uninstall <应用包名,一般是com.xxxx.xxxx格式>

卸载APP

包名及入口获取

  • 包名、类名、主入口
  • package(包名):在APP中每个APP都拥有唯一的包名不能重复,如果重复了就会提示你已经安装是否覆盖安装
  • MainActivity(主入口):每个APP都有一个主要函数的入口
  • activityName(类名):可以看做是每个页面的一个标识句柄

前台页面查看

查看包名类名
1
2
3
4
5
#把软件打开保持前台界面,运行命令
adb shell dumpsys activity | find "mFocusedActivity" #安卓7以内
adb shell dumpsys activity | find "mResumedActivity" #安卓8以上
#Mac查看包名、主入口
adb shell dumpsys window w |grep \/ |grep name=
  • u0 com.xxxx.xxxx/ uo和/中间的就是包名,以com开头,包名后面跟类名,如果没有查到先把软件关了,重新打开 ,F A记得大写(小驼峰,第一个小写,后面首字母大写)

前台查看包名类名

查看启动入口
  • 先把需要查询的App关掉,然后清除日志,再打开“动态监控”,然后启动App
1
2
3
4
#清除日志(关闭 app 后执行)
adb logcat -c
# 动态监控
adb logcat | find "Display"

查看主入口

后台查看

  • 在不运行APP的情况下,直接查看本地的APP文件
  • 需要在adb 的 build-tools目录下(aapt同级目录)启动cmd窗口或者配置path路径
查看包名和启动入口
1
2
# 查看.apk安装包的包名和启动入口
aapt dump badging apk文件路径

查看包名和启动入口

查看包名
1
2
#查看文件的包名
aapt dump badging C:\Users\Administrator\Desktop\inc.apk(APP的路径) | find "package"

查看apk文件包名

查看启动入口
1
aapt dump badging C:\Users\Administrator\Desktop\inc.apk | find "launchable-activity"

查看apk文件启动入口

扩展

系统

1
2
3
4
5
6
7
8
9
10
#
dumpsys meminfo 包名
#读取电量和温度
adb shell dumpsys battery
# 内存使用信息
adb shell dumpsys meminfo
#查看启动时间(一般是看冷启动) (注意大小写,和更换包名,thistime totaltime里面的数据就是启动时间)
adb shell am start -W com.lemon.lemonban/.activity.WelcomeActivity
#获取当前设备的IP地址(wifi)
adb shell "ip addr | grep global"

其它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#启动应用
adb shell am start -n 包名/启动入口
adb shell am start -n com.inc.mobile.manager/com.inc.mobile.manager.view.ui.activity.LaunchActivity
#多台设备下指定一台设备操作
adb -s devicesName 指令       
#adb进程服务
adb start-server 重启服务
adb kill-server  关闭服务 
#Wifi连接/断开设备
adb tcpip port设置端口如5555(需连接usb)
adb connect ip 连接ip设备
adb disconnect ip:port  取消连接ip设备
#重启/关闭设备
adb reboot #重启
adb shell reboot -p #关机
#清除程序数据
adb shell pm clear packageName
#程序安装与卸载
adb install ***.apk    #安装
adb install -t ***.apk #覆盖安装
adb install -r -t ***.apk #RUN出来的包是test-onlu的安装
adb uninstall packageName  #卸载不保留数据
adb uninstall -k packageName #卸载保留数据
#查看已安装的应用
adb shell pm list packages 查看所有应用
adb shell pm list packages -s  查看系统应用
adb shell pm list packages -3  查看三方应用
#查看当前聚焦程序包名、类名
adb shell dumpsys activity | find "mFocusedActivity"  安卓≤7(前台运行)
adb shell dumpsys activity | find "mResumedActivity"   安卓≥8(前台运行程序)
#查看apk安装包包名、启动入口、元素探测
aapt dump badging ***.apk    #查看apk的包名和启动入口
aapt dump badging ***.apk | find "package" #找apk包名
aapt dump badging ***.apk | find "launchable-activity" #找apk启动入口
C:\Users\Administrator>uiautomatorviewer   #启动元素探测bat文件
#监控crash/ANR事件:
adb shell am monitor
#其它
adb shell dumpsys meminfo PID 内存监控
adb shell "ip addr | grep global" 获取设备的IP地址
adb shell am start -W 包名/启动入口  查看启动时间(一般是看冷启动)
adb shell wm size  查看屏幕分辨率
adb shell dumpsys battery 读取电量和温度
adb shell dumpsys meminfo 内存使用信息
adb shell input keyevent 26 82(26息屏或唤醒/82菜单键,上滑解锁可以一起用)
#keyevent对应值: https://www.cnblogs.com/zhuminghui/p/10470865.html
#https://blog.csdn.net/xiezhiming1234/article/details/82117709

通过wifi连接adb

  • 0.首先==个人不推荐wifi连接,不稳定==,如果需要使用需要满足手机和电脑在同一局域网
  • 1.保持usb连接,adb devices能监测到设备
  • 2.==adb tcpip 5555== 确定你的手机和电脑通讯号
  • 3.拔掉usb线,再通过 ==adb connect 手机ip地址==(跟模拟器差不多一个原理,不需要再输端口号了,上面确定过了,手机IP地址,找到wifi,然后找到详细信息里面的地址,需要在局域网内)
  • 4.adb 网络断开设备:==adb disconnect <设备的IP地址>:5555== 即可断开
  • 5.如果多设备连接的情况,需要给每个设备设置不同的tcpip
    ==adb -s822QADU5246SE tcpip 1996==
    ==adb -s f06d7a07 tcpip 1997==
  • 如果一直连接不上,回想一下你的设备会在局域网其它电脑里面连接过该设备吗,手机开发者模式—》调试—》撤销usb调试 然后再试下 第二步 adb tcpip 5555 这个输入一次即可(在不撤销usb调试均有效),后面不用usb 直接进入第三步开始连接 ==不要同一部手机同时使用usb和wifi,会出问题==

wifi连接adb

appium

简介

  • Appium 是移动端自动化测试工具,市面上还有很多如 Robotium UIAutomator
  • Native apps(原生应用):仅使用Android或iOS的标准SDK编写的应用;
  • Web apps(移动浏览器应用):用移动平台的浏览器访问的应用;
  • Hybrid apps(混合应用):把一个基于webview实现的功能进行包装的应用。**更多资料**
栏目 Appium Robotium UIAutomator
是否支持跨进程
是否支持跨平台(Android、iOS)
是否支持脚本录制 需付费
是否支持无源码的APK
支持的编程语言 主流语言均支持 Java Java
支持的应用类型 Native apps、hybrid apps、mobile web apps Native apps、hybrid apps、mobile web apps Native apps、hybrid apps

安装Appium Desktop

📌1.安装后首次打开如果为英文版本可调成中文:左上角View—languages—中文

📌2.配置地址和端口后启动

📌注:这个程序个人感觉兼容性很差(当时的版本),下载的时候找到热度高的版本和对应的位数系统,使用本程序前需要注意以下几点:==打开手机的开发者模式,勾选USB调试== ==手机USB模式不要设置为仅充电== ==通过终端adb devices能监测到设备,并且处于已授权状态== ==尽量不使用wifi模式连接,比较卡== ==部分手机可能需要开启【禁止权限监控】开发者选项–>应用–>禁止权限监控==

ip和端口配置

安装appium-doctor

  • 这个安装非必选项,主要用于检测哪些配置没有设置的
  • 安装命令:==sudo npm install -g appium-doctor==(Mac) 启动命令:==appium-doctor==

appium-doctor

运行

启动

:arrow_forward:运行 Appium 点击上图的“启动服务器V1.15.1”进入下图后点击启动会话“③”

启动会话

参数配置

:one:deviceName**:**设备的名称 如果是WIF无线连接的设备名称输入设备ip:port形式 通过adb devices监会出现:2c0d4390 device,如果监测不到证明没有连上设备,确保驱动安装,调试模式都打开

:two:platformName设备类型 Android / iOS

:three:appPackage获取安装包名&启动入口

:four:appActivity启动路径(启动入口,每个APP只有一个入口)

四大基础数据配置

Error报错处理

Stderr: ‘Security exception: Permission denial: writing to settings

  • 由于未开启权限监控导致开启方法开发者选项–>应用–>:white_check_mark: 禁止权限监控

报错内容:

An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: ‘Command ‘/usr/local/bin/adb -P 5037 -s f06d7a07 shell settings delete global hidden_api_policy_pre_p_apps’ exited with code 255’; Stderr: ‘Security exception: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS java.lang.SecurityException: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS at com.android.providers.settings.SettingsProvider.enforceWritePermission(SettingsProvider.java:2340) at com.android.providers.settings.SettingsProvider.mutateGlobalSetting(SettingsProvider.java:1405) at com.android.providers.settings.SettingsProvider.deleteGlobalSetting(SettingsProvider.java:1388) at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:603) at android.content.ContentProvider.call(ContentProvider.java:2162) at android.content.ContentProvider$Transport.call(ContentProvider.java:481) at com.android.providers.settings.SettingsService$MyShellCommand.deleteForUser(SettingsService.java:399) at com.android.providers.settings.SettingsService$MyShellCommand.onCommand(SettingsService.java:281) at android.os.ShellCommand.exec(ShellCommand.java:104) at com.android.providers.settings.SettingsService.onShellCommand(SettingsService.java:49) at android.os.Binder.shellCommand(Binder.java:881) at android.os.Binder.onTransact(Binder.java:765) at android.os.Binder.execTransactInternal(Binder.java:1021) at android.os.Binder.execTransact(Binder.java:994)’; Code: ‘255’

开启禁止监控权限

Could not find a connected Android device in 20201ms.

  • An unknown server-side error occurred while processing the command. Original error: Could not find a connected Android device in 20201ms.

电脑在设定时间内找不到设备,一般这种情况下用 ==adb devices== 也找不到设备,这个时候去检查一下 ==开发者选项== ==usb调试== 如果都开启了,那再看下==usb连接后不能设置仅充电== ==电脑是否安装了手机的驱动== 如果没有的话需要安装手机的驱动(高通的cpu可以安装高通的通用版),最终要保证能通过 adb 命令检测到手机

开启usb调试

The JAVA_HOME environment variable must be set for Android Tools to work properly

  • 未设置java环境变量

An unknown server-side error occurred while processing the command. Original error: Cannot verify the signature of ‘C:\Users\Administrator\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-uiautomator2-server\apks\appium-uiautomator2-server-v4.21.1.apk’. Original error: The JAVA_HOME environment variable must be set for Android Tools to work properly

  • 通过java javac java -version执行均正常
  • 通过appium-doctor执行也是正常

重新安装

Injecting to another application requires INJECT_EVENTS permission

  • 未开启USB模拟点击

An unknown server-side error occurred while processing the command. Original error: java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission

开启USB模拟点击