提示:阅读本章之前,请先阅读目录
文章目录
- 系列文章目录
- 前言
- 一、Appium 原理
- 二、环境搭建,一键搞定
- 1. 安装Java JDK
- 2. Android SDK 安装与配置
- 3. 安装安卓模拟器
- 4. 安装appium server
- 5. 安装appium-python-client
- 三、安卓常用的元素定位工具
- 1. Android SDK Uiautomatorviewer
- 2. Appium server
- 四、Python+Appium
- 1. 运行app
- 2. resourceid定位
- 3. android_uiautomator定位
- 4. xpath定位
- 5. 滑动操作
- 五、ADB常用命令
- 1. adb --version
- 2. adb connect
- 3. adb devices
- 4. adb install
- 5. adb shell dumpsys window | findstr mCurrentFocus
- 6. adb uninstall
- 7. adb shell
- 8. adb push
- 9. adb pull
- 10. adb shell am start -n
- 11. adb shell pm clear
- 12. adb shell dumpsys meminfo
- 13. adb shell ps -ef | grep
- 14. adb shell kill
- 15. adb shell input keyevent KEYCODE_
- 更新日志
前言
Appium 是跨平台,开源的app自动化测试框架,用来测试app程序,支持 Android和ios 操作系统
一、Appium 原理
为什么可以通过代码,就能操作不同操作系统的不同版本的手机终端的app呢?
大致原理如下:
appium,实际上是继承了selenium的,所以很多方法,都可以共用,甚至用法都一致,也就是appium的父类就是selenium,基于selenium,封装了app特有的方法
我们回顾一下selenium操作浏览器的过程:
selenium 发送http指令 —> 浏览器驱动 —> 操控浏览器进行操作
那么,我们的appium,会多了一个步骤
appium脚本代码 --> 发送指令给到appium server --> 转发给了Android SDK --> 操控手机端
那么实际上,能够对安卓系统的手机进行操作的,就是Android SDK
Android SDK 是基于 java开发的,所以要想运行,需要先安装JAVA JDK
https://www.oracle.com/java/technologies/downloads/#jdk18-windows
建议下载 1.8.0 的jdk,java jdk别名比较多,也有的叫 java8,也有叫 java18
下载并安装
注意:设置环境变量,这步很关键,没有设好环境变量,可能会导致很多问题
- 系统环境变量,新建,键名:JAVA_HOME,键值:(安装后的java jdk 根目录)
- 系统环境变量,修改,Path,添加,%JAVA_HOME%bin;%JAVA_HOME%jrebin;
- 系统环境变量,新建,键名:CLASSPATH,键值:%JAVA_HOME%lib;%JAVA_HOME%libtools.jar
最后,校验一下是否配置成功
cmd命令窗口,输入,java -version
C:UsersUser>java -version java version "1.8.0_191" Java(TM) SE Runtime Environment (build 1.8.0_191-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
有出现版本号,即配置成功
2. Android SDK 安装与配置官方下载网址:
http://tools.android-studio.org/index.php/sdk/
下载windows版本即可
下载完之后解压,建议找个没有中文名的目录,然后路径简单,可以直接放到D盘下面,第一个是为了方便查找,第二个是后面会一直用到这个sdk的路径,简短一点,方便调用,不容易出错
然后,打开 SDK Manager.exe。你要做两件事情,就是安装基础的包,以及对应的安卓包
注意:不要贪方便,全部都勾选安装,这里面的包都非常大,需要安装的时间,比较长,所以,选择我们需要的安装即可,几个需要安装的,都要十几分钟了
第一步,基础包,一共四个
第二步,对应安卓版本的包,三个
这个安卓版本,指的是模拟器里面的安卓版本,所以,你如果不知道模拟器的安卓版本,就先安装模拟器
我用的是Mumu模拟器,安卓版本是6.0.1,所以,就选择安卓6的
然后,等待安装成功即可
然后,我们在此期间,可以配置一下安卓JDK的环境变量
注意:这一步也是非常关键,没有配置后,后面Appium是无法使用的
- 系统环境变量,新建,键名:ANDROID_HOME,键值:D:android-sdk-windows(这里注意写你实际的android sdk的路径)
- 系统环境变量,修改,Path,添加:%ANDROID_HOME%platform- tools;%ANDROID_HOME%tools;%ANDROID_HOME%build- tools29.0.3;
- build-tools里面的版本,如果不是29.0.3,也做修改
cmd命令窗口,输入 adb
C:UsersUser>adb Android Debug Bridge version 1.0.41 Version 29.0.6-6198805 Installed as D:android-sdk-windowsplatform-toolsadb.exe global options: -a listen on all network interfaces, not just localhost -d use USB device (error if multiple devices connected) -e use TCP/IP device (error if multiple TCP/IP devices available) -s SERIAL use device with given serial (overrides $ANDROID_SERIAL) -t ID use device with given transport id -H name of adb server host [default=localhost] -P port of adb server [default=5037] -L SOCKET listen on given socket for adb server [default=tcp:localh
如果提示,无法识别adb,请先确认环境变量有没有配置正确
如果都配置正确的情况,可能是,第一次运行,系统还无法识别adb命令
cmd命令进入,cd D:android-sdk-windowsplatform-tools
然后,再输入adb,直接在这个路径,运行adb,只要能够正常运行一次,系统就能识别了
有很多种模拟器可以选择,夜神(端口号:62001),雷神(端口号:5555),MuMu(端口号:7555),逍遥(端口号:21503)等
选择其中一个安装即可,我这里用的是MuMu,安卓版本是6.0的,然后,系统简洁,运行速度比夜神好,不容易死机重启,功能也强大
安装完之后运行模拟器,进入安卓系统
打开设置,拉到最下面,选择“关于平板电脑”
连续点击5次以上,版本号
直到提示,进入开发者模式
返回,进入,开发者选项
开启 USB 调试,要不然appium是链接不了模拟器的
然后,还有另外两个选项,也可以一起开启,方便自动化调试
开启之后,我们就可以看到效果,点击,拖动的时候
会有一个坐标效果,这样我们就可以知道,自动化现在在执行什么内容
然后,在最顶部,有显示坐标系,这样,就可以方便我们使用屏幕定位进行操作
注意:每个模拟器都有adb.exe,所以,我们最好把模拟器的adb替换成我们的adb版本,如果版本不一样,也容易出问题
可以进入安装目录。然后搜索adb
每个模拟器的命名规范不一样,比如:夜神模拟器的adb就是,nox_adb.exe
所以,我们就需要把自己的adb改成相对应的,模拟器原来的adb备份好就可以
MuMu的adb是adb_server.exe
MuMuemulatornemuvmonitorbinadb_server.exe
下载地址:http://www.kkx.net/soft/28316.html
下载完,安装即可
5. 安装appium-python-client使用pip安装即可
pip install appium-python-client
三、安卓常用的元素定位工具 1. Android SDK Uiautomatorviewer路径:ndroid-sdk-windowstoolsuiautomatorviewer.bat
先打开模拟器
刷新之后,会自动去搜索连接上的模拟器
在此之前,记得用adb连接模拟器
这里mumu模拟器端口为7555
打开cmd,输入命令:adb connect 127.0.0.1:7555
我们可以看到连接成功了
左边是模拟器画面,右边是关于元素定位的一些属性
我们尝试,打开一个app,然后刷新
左边可以选择元素,然后右边就可以出现该元素的相关属性,这样我们就可以通过代码脚本来实现对app自动化的测试
2. Appium server在使用Appium server的元素定位工具的时候,我们需要先提供参数
这些参数,可以在python中用到
我们先下载要测试的app的软件包,然后通过aapt解包,得到程序的包名,以及程序的启动页
- 被测的app程序包.apk
- aapt dump badging 被测的app程序包.apk的路径
我们把被测的apk程序,放到aapt的路径里面,这样是为了方便调用
android-sdk-windowsbuild-tools29.0.3
然后,我们再用cmd进入aapt的路径
android-sdk-windowsbuild-tools29.0.3
C:Usersandroid-sdk-windowsbuild-tools29.0.3>aapt dump badging kaoyan3.1.0.apk package: name='com.tal.kaoyan' versionCode='55' versionName='3.1.0' platformBuildVersionName='N' sdkVersion:'10' targetSdkVersion:'21' uses-permission: name='getui.permission.GetuiService.com.tal.kaoyan' uses-permission: name='android.permission.SYSTEM_ALERT_WINDOW' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-permission: name='android.permission.MOUNT_UNMOUNT_FILESYSTEMS' uses-permission: name='android.permission.GET_TASKS' uses-permission: name='android.permission.CHANGE_WIFI_STATE' ..........以下省略
当然,如果解包出来的内容太长,我们可以使用window的findstr来筛选
C:Usersandroid-sdk-windowsbuild-tools29.0.3>aapt dump badging kaoyan3.1.0.apk | findstr package package: name='com.tal.kaoyan' versionCode='55' versionName='3.1.0' platformBuildVersionName='N'
C:Usersandroid-sdk-windowsbuild-tools29.0.3>aapt dump badging kaoyan3.1.0.apk | findstr activity launchable-activity: name='com.tal.kaoyan.ui.activity.SplashActivity' label='' icon=''
然后提取我们要的信息
package: name='com.tal.kaoyan' launchable-activity: name='com.tal.kaoyan.ui.activity.SplashActivity'
填到下面的参数
{
"platformName": "Android",
"platformVersion": "6.0.1",
"deviceName": "127.0.0.1:7555",
"appPackage": "com.tal.kaoyan",
"appActivity": "com.tal.kaoyan.ui.activity.SplashActivity",
"noReset": True
}
至此,我们就有了连接模拟器的所有参数
我们打开appium server
直接开启即可
点击这个放大镜的图标
如果保存不了,就把最后一个选项的
“noReset”: True 改为 “noReset”: 1
然后保存之后,再到左边改为布尔值,为True
然后点击开启即可,右下角
然后稍等即可,有点慢
这边控制台,就显示连接成功了
可以了,这样,我们就可以用appium server的定位元素来实现,获取元素属性
四、Python+Appium 1. 运行appfrom appium import webdriver
# 1. 设置终端参数
desired_caps = {
# 操作系统
"platformName": "Android",
# 系统版本
"platformVersion": "6.0.1",
# 设备名
"deviceName": "127.0.0.1:7555",
# app的包名
"appPackage": "com.tal.kaoyan",
# app的启动页
"appActivity": "com.tal.kaoyan.ui.activity.SplashActivity",
# 不重置
"noReset": True
}
# 2. 发送指令给到appium server
driver = webdriver.Remote(
"http://127.0.0.1:4723/wd/hub",
desired_caps
)
2. resourceid定位
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# 1. 设置终端参数
desired_caps = {
"platformName": "Android",
"platformVersion": "6.0.1",
"deviceName": "127.0.0.1:7555",
"appPackage": "com.tal.kaoyan",
"appActivity": "com.tal.kaoyan.ui.activity.SplashActivity",
"noReset": True
}
# 2. 发送指令给到appium server
driver = webdriver.Remote(
"http://127.0.0.1:4723/wd/hub",
desired_caps
)
# 隐式等待
driver.implicitly_wait(15)
# 通过resoureId
username = driver.find_element(AppiumBy.ID, 'com.tal.kaoyan:id/login_email_edittext').send_keys('admin')
password = driver.find_element(AppiumBy.ID, 'com.tal.kaoyan:id/login_password_edittext').send_keys('admin')
driver.find_element(AppiumBy.ID, 'com.tal.kaoyan:id/login_login_btn').click()
3. android_uiautomator定位
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# 1. 设置终端参数
desired_caps = {
"platformName": "Android",
"platformVersion": "6.0.1",
"deviceName": "127.0.0.1:7555",
"appPackage": "com.tal.kaoyan",
"appActivity": "com.tal.kaoyan.ui.activity.SplashActivity",
"noReset": True
}
# 2. 发送指令给到appium server
driver = webdriver.Remote(
"http://127.0.0.1:4723/wd/hub",
desired_caps
)
# 隐式等待
driver.implicitly_wait(15)
# 通过 android_uiautomator
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'text("请输入用户名")').send_keys('hello world')
4. xpath定位
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# 1. 设置终端参数
desired_caps = {
"platformName": "Android",
"platformVersion": "6.0.1",
"deviceName": "127.0.0.1:7555",
"appPackage": "com.tal.kaoyan",
"appActivity": "com.tal.kaoyan.ui.activity.SplashActivity",
"noReset": True
}
# 2. 发送指令给到appium server
driver = webdriver.Remote(
"http://127.0.0.1:4723/wd/hub",
desired_caps
)
# 隐式等待
driver.implicitly_wait(15)
# Xpath 定位
driver.find_element(AppiumBy.XPATH, '//*[@resource-id="com.tal.kaoyan:id/login_login_btn"]').click()
5. 滑动操作
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
# 1. 设置终端参数
desired_caps = {
"platformName": "Android",
"platformVersion": "6.0.1",
"deviceName": "127.0.0.1:7555",
"appPackage": "com.tal.kaoyan",
"appActivity": "com.tal.kaoyan.ui.activity.SplashActivity",
"noReset": True
}
# 2. 发送指令给到appium server
driver = webdriver.Remote(
"http://127.0.0.1:4723/wd/hub",
desired_caps
)
# 隐式等待
driver.implicitly_wait(15)
# 获取当前屏幕的尺寸
window_size = driver.get_window_size()
print('当前窗口大小: ', window_size)
win_x = window_size['width']
win_y = window_size['height']
# 左滑两次
for i in range(0, 2):
driver.swipe(
start_x=win_x*0.8,
start_y=win_y*0.5,
end_x=win_x*0.2,
end_y=win_y*0.5,
duration=1000
)
五、ADB常用命令
1. adb --version
查看版本,查看adb路径
C:>adb --version Android Debug Bridge version 1.0.41 Version 29.0.6-6198805 Installed as C:Usersandroid-sdk-windowsplatform-toolsadb.exe2. adb connect
连接安卓设备
C:>adb connect 127.0.0.1:7555 connected to 127.0.0.1:75553. adb devices
查看所有连接设备
C:>adb devices List of devices attached 127.0.0.1:7555 device4. adb install
安装app,前提是先连接好安卓设备
C:>adb install kaoyan3.1.0.apk
Performing Push Install
kaoyan3.1.0.apk: 1 file pushed, 0 skipped. 1.8 MB/s (9699881 bytes in 5.075s)
pkg: /data/local/tmp/kaoyan3.1.0.apk
Success
加上 -r,就是覆盖安装,app不会卸载,会直接重复安装,可以测试app是否会丢失数据
5. adb shell dumpsys window | findstr mCurrentFocus查看当前运行的app的包名及页面
C:>adb shell dumpsys window | findstr mCurrentFocus
mCurrentFocus=Window{e8246e4 u0 com.tal.kaoyan/com.tal.kaoyan.ui.activity.SplashActivity}
我们可以看到,appPackage,以及,appActivity都获取到了
6. adb uninstall卸载app,后面是包名,appPackage
C:>adb uninstall com.tal.kaoyan Success7. adb shell
进入终端
C:>adb shell root@x86:/ #8. adb push
语法:adb push 本地文件 安卓路径
向手机传入文件
我们先获取手机文件夹的路径,Download
我们可以通过adb shell,进入安卓的终端来查找文件夹
C:>adb shell root@x86:/ # find -name Download ./storage/emulated/0/Download ./mnt/runtime/write/emulated/0/Download ./mnt/runtime/read/emulated/0/Download ./mnt/runtime/default/emulated/0/Download find: ./proc/2/task/2/exe: No such file or directory find: ./proc/2/exe: No such file or directory find: ./proc/3/task/3/exe: No such file or directory find: ./proc/3/exe: No such file or directory find: ./proc/13/task/13/exe: No such file or directory find: ./proc/13/exe: No such file or directory 后面省略
可以看到第一个就是,./storage/emulated/0/Download
C:>adb push kaoyan3.1.0.apk ./storage/emulated/0/Download kaoyan/kaoyan3.1.0.apk: 1 file pushed, 0 skipped. 1.7 MB/s (9699881 bytes in 5.350s)
上传成功
从安卓下载文件到电脑
语法:adb pull 安卓路径的文件 电脑路径
C:>adb pull ./storage/emulated/0/Download/kaoyan3.1.0.apk D:download ./storage/emulated/0/Download/kaoyan3.1.0.apk: 1 file pulled, 0 skipped. 2.3 MB/s (9699881 bytes in 4.046s)
下载成功
打开app
后面跟 appPackage/appActivity
C:>adb shell am start -n com.tal.kaoyan/com.tal.kaoyan.ui.activity.SplashActivity
Starting: Intent { cmp=com.tal.kaoyan/.ui.activity.SplashActivity }
11. adb shell pm clear
后面跟appPackage
清除app的缓存
C:>adb shell pm clear com.tal.kaoyan Success12. adb shell dumpsys meminfo
查看某个app占用内存情况
后面跟appPackage
C:>adb shell dumpsys meminfo com.tal.kaoyan
Applications Memory Usage (kB):
Uptime: 51452324 Realtime: 51452324
** MEMINFO in pid 7524 [com.tal.kaoyan] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 0 0 0 0 14592 12569 2022
Dalvik Heap 8702 8656 0 0 7834 6967 867
Dalvik Other 1545 1544 0 0
Stack 40 40 0 0
Ashmem 2 0 0 0
Other dev 4 0 4 0
13. adb shell ps -ef | grep
后面跟appPackage
windows语法
adb shell “ps -ef | com.tal.kaoyan”
mac,linux语法
adb shell ps -ef | com.tal.kaoyan
禁用掉某个进程
后面跟进程pid
adb shell kill 9999
15. adb shell input keyevent KEYCODE_输入某个键
后面跟键名
输入1,2,3,4等
C:>adb shell input keyevent KEYCODE_1 C:>adb shell input keyevent KEYCODE_2 C:>adb shell input keyevent KEYCODE_3
输入a,b,c
C:>adb shell input keyevent KEYCODE_A C:>adb shell input keyevent KEYCODE_B C:>adb shell input keyevent KEYCODE_C
更新日志
提示:将会持续优化更新
20220724,Appium原理,环境搭建,一键搞定,安卓常用的元素定位工具,Python+Appium,ADB常用命令



