提示:阅读本章之前,请先阅读目录
Appium 是跨平台,开源的app自动化测试框架,用来测试app程序,支持 Android和ios 操作系统
为什么可以通过代码,就能操作不同操作系统的不同版本的手机终端的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
下载并安装
注意:设置环境变量,这步很关键,没有设好环境变量,可能会导致很多问题
最后,校验一下是否配置成功
cmd命令窗口,输入,java -version
C:\Users\User>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)
有出现版本号,即配置成功
官方下载网址:
http://tools.android-studio.org/index.php/sdk/
下载windows版本即可
下载完之后解压,建议找个没有中文名的目录,然后路径简单,可以直接放到D盘下面,第一个是为了方便查找,第二个是后面会一直用到这个sdk的路径,简短一点,方便调用,不容易出错
然后,打开 SDK Manager.exe。你要做两件事情,就是安装基础的包,以及对应的安卓包
注意:不要贪方便,全部都勾选安装,这里面的包都非常大,需要安装的时间,比较长,所以,选择我们需要的安装即可,几个需要安装的,都要十几分钟了
第一步,基础包,一共四个
第二步,对应安卓版本的包,三个
这个安卓版本,指的是模拟器里面的安卓版本,所以,你如果不知道模拟器的安卓版本,就先安装模拟器
我用的是Mumu模拟器,安卓版本是6.0.1,所以,就选择安卓6的
然后,等待安装成功即可
然后,我们在此期间,可以配置一下安卓JDK的环境变量
注意:这一步也是非常关键,没有配置后,后面Appium是无法使用的
cmd命令窗口,输入 adb
C:\Users\User>adb
Android Debug Bridge version 1.0.41
Version 29.0.6-6198805
Installed as D:\android-sdk-windows\platform-tools\adb.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-windows\platform-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
MuMu\emulator\nemu\vmonitor\bin\adb_server.exe
下载地址:http://www.kkx.net/soft/28316.html
下载完,安装即可
【建议】在GitHub下载
https://github.com/appium/appium-desktop/releases
选择 exe的格式,下载速度会很快
使用pip安装即可
pip install appium-python-client
路径:ndroid-sdk-windows\tools\uiautomatorviewer.bat
先打开模拟器
在此之前,记得用adb连接模拟器
这里mumu模拟器端口为7555
打开cmd,输入命令:adb connect 127.0.0.1:7555
我们可以看到连接成功了
左边是模拟器画面,右边是关于元素定位的一些属性
我们尝试,打开一个app,然后刷新
左边可以选择元素,然后右边就可以出现该元素的相关属性,这样我们就可以通过代码脚本来实现对app自动化的测试
在使用Appium server的元素定位工具的时候,我们需要先提供参数
这些参数,可以在python中用到
我们先下载要测试的app的软件包,然后通过aapt解包,得到程序的包名,以及程序的启动页
我们把被测的apk程序,放到aapt的路径里面,这样是为了方便调用
android-sdk-windows\build-tools\29.0.3
然后,我们再用cmd进入aapt的路径
android-sdk-windows\build-tools\29.0.3
C:\Users\android-sdk-windows\build-tools\29.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:\Users\android-sdk-windows\build-tools\29.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:\Users\android-sdk-windows\build-tools\29.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的定位元素来实现,获取元素属性
from 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
)
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()
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')
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()
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路径
C:\>adb --version
Android Debug Bridge version 1.0.41
Version 29.0.6-6198805
Installed as C:\Users\android-sdk-windows\platform-tools\adb.exe
连接安卓设备
C:\>adb connect 127.0.0.1:7555
connected to 127.0.0.1:7555
查看所有连接设备
C:\>adb devices
List of devices attached
127.0.0.1:7555 device
安装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是否会丢失数据
查看当前运行的app的包名及页面
C:\>adb shell dumpsys window | findstr mCurrentFocus
mCurrentFocus=Window{e8246e4 u0 com.tal.kaoyan/com.tal.kaoyan.ui.activity.SplashActivity}
我们可以看到,appPackage,以及,appActivity都获取到了
卸载app,后面是包名,appPackage
C:\>adb uninstall com.tal.kaoyan
Success
进入终端
C:\>adb shell
root@x86:/ #
语法: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 }
后面跟appPackage
清除app的缓存
C:\>adb shell pm clear com.tal.kaoyan
Success
查看某个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
后面跟appPackage
windows语法
adb shell “ps -ef | com.tal.kaoyan”
mac,linux语法
adb shell ps -ef | com.tal.kaoyan
禁用掉某个进程
后面跟进程pid
adb shell kill 9999
输入某个键
后面跟键名
输入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常用命令