2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程

系列文章目录

提示:阅读本章之前,请先阅读目录


文章目录

  • 系列文章目录
  • 前言
  • 一、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 --> 操控手机端
2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第1张图片
那么实际上,能够对安卓系统的手机进行操作的,就是Android SDK

二、环境搭建,一键搞定

1. 安装Java JDK

Android SDK 是基于 java开发的,所以要想运行,需要先安装JAVA JDK

https://www.oracle.com/java/technologies/downloads/#jdk18-windows

建议下载 1.8.0 的jdk,java jdk别名比较多,也有的叫 java8,也有叫 java18

下载并安装

注意:设置环境变量,这步很关键,没有设好环境变量,可能会导致很多问题

  1. 系统环境变量,新建,键名:JAVA_HOME,键值:(安装后的java jdk 根目录)
  2. 系统环境变量,修改,Path,添加,%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
  3. 系统环境变量,新建,键名:CLASSPATH,键值:%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

最后,校验一下是否配置成功

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)

有出现版本号,即配置成功

2. Android SDK 安装与配置

官方下载网址:
http://tools.android-studio.org/index.php/sdk/

下载windows版本即可

下载完之后解压,建议找个没有中文名的目录,然后路径简单,可以直接放到D盘下面,第一个是为了方便查找,第二个是后面会一直用到这个sdk的路径,简短一点,方便调用,不容易出错

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第2张图片

然后,打开 SDK Manager.exe。你要做两件事情,就是安装基础的包,以及对应的安卓包

注意:不要贪方便,全部都勾选安装,这里面的包都非常大,需要安装的时间,比较长,所以,选择我们需要的安装即可,几个需要安装的,都要十几分钟了

第一步,基础包,一共四个

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第3张图片
2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第4张图片

第二步,对应安卓版本的包,三个

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第5张图片

这个安卓版本,指的是模拟器里面的安卓版本,所以,你如果不知道模拟器的安卓版本,就先安装模拟器
我用的是Mumu模拟器,安卓版本是6.0.1,所以,就选择安卓6的

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第6张图片
2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第7张图片

然后,等待安装成功即可

然后,我们在此期间,可以配置一下安卓JDK的环境变量

注意:这一步也是非常关键,没有配置后,后面Appium是无法使用的

  1. 系统环境变量,新建,键名:ANDROID_HOME,键值:D:\android-sdk-windows(这里注意写你实际的android sdk的路径)
  2. 系统环境变量,修改,Path,添加:%ANDROID_HOME%\platform- tools;%ANDROID_HOME%\tools;%ANDROID_HOME%\build- tools\29.0.3;
  3. build-tools里面的版本,如果不是29.0.3,也做修改

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,只要能够正常运行一次,系统就能识别了

3. 安装安卓模拟器

有很多种模拟器可以选择,夜神(端口号:62001),雷神(端口号:5555),MuMu(端口号:7555),逍遥(端口号:21503)等

选择其中一个安装即可,我这里用的是MuMu,安卓版本是6.0的,然后,系统简洁,运行速度比夜神好,不容易死机重启,功能也强大

安装完之后运行模拟器,进入安卓系统

打开设置,拉到最下面,选择“关于平板电脑”
在这里插入图片描述

连续点击5次以上,版本号

在这里插入图片描述

直到提示,进入开发者模式

在这里插入图片描述

返回,进入,开发者选项

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第8张图片

开启 USB 调试,要不然appium是链接不了模拟器的

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第9张图片

然后,还有另外两个选项,也可以一起开启,方便自动化调试

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第10张图片
开启之后,我们就可以看到效果,点击,拖动的时候

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第11张图片

会有一个坐标效果,这样我们就可以知道,自动化现在在执行什么内容

然后,在最顶部,有显示坐标系,这样,就可以方便我们使用屏幕定位进行操作

在这里插入图片描述

注意:每个模拟器都有adb.exe,所以,我们最好把模拟器的adb替换成我们的adb版本,如果版本不一样,也容易出问题

可以进入安装目录。然后搜索adb

每个模拟器的命名规范不一样,比如:夜神模拟器的adb就是,nox_adb.exe
所以,我们就需要把自己的adb改成相对应的,模拟器原来的adb备份好就可以

MuMu的adb是adb_server.exe
MuMu\emulator\nemu\vmonitor\bin\adb_server.exe

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第12张图片

4. 安装appium server

下载地址:http://www.kkx.net/soft/28316.html

下载完,安装即可

【建议】在GitHub下载
https://github.com/appium/appium-desktop/releases
选择 exe的格式,下载速度会很快

5. 安装appium-python-client

使用pip安装即可

pip install appium-python-client

三、安卓常用的元素定位工具

1. Android SDK Uiautomatorviewer

路径:ndroid-sdk-windows\tools\uiautomatorviewer.bat

先打开模拟器

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第13张图片
刷新之后,会自动去搜索连接上的模拟器

在此之前,记得用adb连接模拟器

这里mumu模拟器端口为7555

打开cmd,输入命令:adb connect 127.0.0.1:7555

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第14张图片

我们可以看到连接成功了

左边是模拟器画面,右边是关于元素定位的一些属性

我们尝试,打开一个app,然后刷新

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第15张图片

左边可以选择元素,然后右边就可以出现该元素的相关属性,这样我们就可以通过代码脚本来实现对app自动化的测试

2. Appium server

在使用Appium server的元素定位工具的时候,我们需要先提供参数
这些参数,可以在python中用到

我们先下载要测试的app的软件包,然后通过aapt解包,得到程序的包名,以及程序的启动页

  1. 被测的app程序包.apk
  2. aapt dump badging 被测的app程序包.apk的路径

我们把被测的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

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第16张图片
直接开启即可

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第17张图片
点击这个放大镜的图标

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第18张图片

如果保存不了,就把最后一个选项的

“noReset”: True 改为 “noReset”: 1

然后保存之后,再到左边改为布尔值,为True

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第19张图片

然后点击开启即可,右下角

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第20张图片

然后稍等即可,有点慢

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第21张图片
这边控制台,就显示连接成功了

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第22张图片

可以了,这样,我们就可以用appium server的定位元素来实现,获取元素属性

四、Python+Appium

1. 运行app

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
)

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()

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第23张图片

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:\Users\android-sdk-windows\platform-tools\adb.exe

2. adb connect

连接安卓设备

C:\>adb connect 127.0.0.1:7555
connected to 127.0.0.1:7555

3. adb devices

查看所有连接设备

C:\>adb devices
List of devices attached
127.0.0.1:7555  device

4. 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
Success

7. adb shell

进入终端

C:\>adb shell
root@x86:/ #

8. adb push

语法:adb push 本地文件 安卓路径
向手机传入文件

我们先获取手机文件夹的路径,Download

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第24张图片

我们可以通过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)

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第25张图片
上传成功

9. adb pull

从安卓下载文件到电脑

语法: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)

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第26张图片
下载成功

10. adb shell am start -n

打开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
Success

12. 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

14. adb shell kill

禁用掉某个进程

后面跟进程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

2022软件测试技能 APP自动化测试 Python+Appium+Uiautomator2 实战教程_第27张图片

输入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常用命令

你可能感兴趣的:(python,开发语言)