app自动化:python + appium

app自动化:python + appium

一、环境配置

https://developer.android.google.cn/studio/command-line/adb?hl=zh-cn#howadbworks

1、java JDK环境

下载安装

https://www.rstk.cn/news/18764.html?action=onClick
官网下载:https://www.oracle.com/cn/java/technologies/downloads/
在这里插入图片描述

配置环境变量

配置路径:系统属性-高级-环境变量-系统变量

  • 系统变量下新建:
    • 变量名:JAVA_HOME
    • 变量值:D:\Program Files\Java\jdk1.8.0_321 安装jdk的路径
  • 系统变量下新建:
    • 变量名:CLASS_PATH
    • 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
  • 系统变量下点击Path-点击编辑-点击新建:
    • 增加 %JAVA_HOME%\bin
    • 增加 %JAVA_HOME%\jre\bin
  • 全部保存后win+R打开CMD输入以下内容检查环境是否配置完成:
    • java
    • java -version
    • javac

2、安卓模拟器下载

夜神、逍遥、雷电、MUMU……

3、Android SDK环境

https://www.cnblogs.com/nebie/p/9145627.html

下载SDK

https://www.androiddevtools.cn/#
在这里插入图片描述

安装Android版本

进入SDK的解压目录下,双击“SDK Manager.exe”打开SDK管理器
在这里插入图片描述

SDK环境配置

在解压完成后,就可以开始配置环境变量了。方法和设置JAVA JDK的环境变量的方法类似。

新建系统变量:
创建ANDROID_HOME,值是你的刚刚SDK的解压目录,比如 E:\Android\android-sdk-windows
在这里插入图片描述
编辑系统变量中的Path:
将SDK的platform-tools和tool的路径添加到Path 变量内(这两个目录在你通过SDK Manager安装更新Android SDK Tools和Android SDK Platform-tools之后就会有了)
1 新建 %ANDROID_HOME%\platform-tools
2 新建 %ANDROID_HOME%\tools
在这里插入图片描述

替换adb.exe文件

用platform-tools文件夹中的adb.exe文件替换掉模拟器安装完成后的以adb.exe结尾的文件

验证Android SDK

1
android -h

在这里插入图片描述

通过adb连接电脑

真机通过adb连接电脑

准备:需要一个安卓手机+usb数据线
1、用数据线把电脑和手机连接起来。Usb插口尽量插在后面的usb口上。
2、如果手机上出现如下图片,点确认
在这里插入图片描述

如果没有出现,先进行第三步
3、打开手机设置,找到开发者选项
有些手机需要连续点击自己的版本号,才能出现这个选项,具体根据机型不同有一定变化,可自行百度
在这里插入图片描述

4、点击开发者选项,打开usb调试
在这里插入图片描述

5、此时可选择拔掉数据线,重新插拔。看是否出现第二步。
如没有出现则进行重复以上步骤,或者检查数据线,或者检查usb插口。

7、如果此时想在airtest里面控制手机
先点击刷新adb。出现我们的设备信息后,点击connect。注意,正常的状态应该是device状态。

注意:在刷新adb的过程中,可能你的手机上还会出现调试提醒,记得点击同意。
如果一直找不到你的手机设备信息,可以选择重新插usb线。
在这里插入图片描述

在连接时可能会出现让你下载两个应用,正常同意安装即可。
一个是键盘插件,一个是框架插件。
Yosemite是输入法软件,如果导致手机无法正常打字,将该软件卸载掉即可,但是在自动化过程中,必须保留该软件。
在这里插入图片描述
在这里插入图片描述

模拟器通过adb连接电脑

市场上有大量的模拟器,可以模拟手机,有各种手机可选
appium连接模拟器进行自动化测试时,需要使用adb来连接模拟器,具体操作步骤:
1、打开模拟器
2、在cmd中输入:adb devices
此时出现的列表中找不到对应的安卓设备
3、 在cmd中输入:adb connect 127.0.0.1:7555(7555为模拟器对应的端口号,此处为网易MUMU模拟器)
在这里插入图片描述

4、再次输入:adb devices,列表中找到对应模拟器表面连接成功
在这里插入图片描述

Airtest连接模拟器

airtest内置的有adb
1.首先,与手机类似,需要打开模拟器的 开发者选项-允许USB调试 。
部分模拟器可能需要找到 设置-关于手机-版本号 点击多次后才能打开开发者选项:
在这里插入图片描述

2.打开AirtestIDE设备窗内的 远程设备连接 ,
输入 adb connect 127.0.0.1:62001 后(该端口号与模拟器品牌相关),点击 连接 按钮
不同模拟器使用不同的端口号:
在这里插入图片描述

3.设备列表中可见 127.0.0.1:7555 设备,先点击Connect按钮旁的下拉菜单,勾选Javacap模式后,再点击 Conenct 按钮(如果没有勾选Javacap模式,会导致看到的手机画面是黑屏)。如果还是未能连接成功,可以补充勾选 其他选项再连。
在这里插入图片描述

4.以下就是连接好了
在这里插入图片描述

补充.:部分模拟器相关问题

1.连模拟器时,需要先勾选 use javacap 选项后再点击 connect 按钮连接,才能避免看到的屏幕是黑屏。
2.在部分版本的模拟器上,可能勾选了 use javacap 后依然连接失败,此时可以尝试再勾选 use adb orientation 选项后再重新连接即可。
3.部分品牌模拟器,可能出现无法正常点击的现象,可以尝试勾选 use ADBtouch 后再连接。
4.部分品牌模拟器,可能无法调用yosemite输入法,导致 text() 接口无法输入文字,可以先确认模拟器设置中,硬件-物理键盘 是否被勾选了,取消勾选后再重新尝试即可。如果依然无法输入,可以考虑换用poco来输入,或是直接使用adb指令输入英文内容

adb通过wifi连接android设备

adb支持usb连接模式和tcpip连接模式,我们可以用tcpip模式通过wifi无线连接adb。
具体连接步骤如下:
1、确认本机PC没有任何adb设备连接,包括模拟器和usb连接
查看当前PC端连接有多少设备:
adb devices命令后,列表显示为空;
2、将远程android设备接入Wi-Fi,并查看其IP地址
查看android设备的IP地址,这里有三种方式查看Android设备IP。
(1). 设置-关于手机-状态信息-IP地址中查看
(2). 设置-WLAN-点击当前链接上的Wi-Fi查看IP
例如:设置—〉无线或网络—〉WLAN设置—〉查看当前连接Wi-Fi的IP地址(部分机型需要按menu键并选择“高级”选项—〉IP地址)
(3). 通过adb命令查看设备IP地址:adb shell netcfg

前提:(设备已经和PC建立了usb连接)
确保电脑和Android设备连接在同一个WIFI网络环境(同一个局域网下,进行通信)
3、本机command命令下执行ping android设备的IP
如果ping成功,说明可以连接
在这里插入图片描述

4,执行 adb connect
知道设备IP地址之后,就可以用adb connect命令通过IP和端口号连接adb。

如果显示连接成功,则可继续执行后面的操作;
在这里插入图片描述

5、执行 adb connect不成功,如下图显示:connect拒绝
在这里插入图片描述

用adb tcpip模式重启adb
adb tcpip 5555
在这里插入图片描述

连接成功,connected to 10.129.49.143:5555
adb connect ip连接成功以后可以执行原来usb连接时的所有命令

4、Appium Desktop服务端安装

下载安装appium-sever

https://github.com/appium/appium-desktop/releases
在这里插入图片描述
在这里插入图片描述

Simple:基础配置

  • Host:服务端的主机地址
    • appium客户端运行时,会通过改地址发送请求到appium服务端
    • 默认0.0.0.0,代表appium服务端所有主机的所有IP
    • 同127.0.0.1一样,都是本机地址
  • Port:
    • 服务端的主机端口
    • 默认4723 appium客户端与appium服务端通过4723端口通讯

      Advanced:高级配置

  • General:常规选项,进行Android和IOS自动化测试时公共的设置项
    • sever Address:0.0.0.0
    • Server Port:4723
    • Logfile Path:存储日志的路径设置
    • Log Level:debug 日志级别设置
    • Override Temp Path:覆盖临时路径,很少用
    • Node Config File Path:节点配置文件,可以完成多少并发测试
    • Local Timezone:当前时区,可以勾选
    • Allow Session Override:允许会话覆盖,可以勾选
    • Log Timestamps
    • Suppress Log Color:日志颜色,可以勾选
    • Strict Caps Mode:配置模式,不勾选
    • Relaxed Security:安全配置,不勾选
    • Allow CORS
  • IOS:仅包含用于IOS自动化测试的设置项
    • 默认即可
  • Android:仅包含用于Android自动化测试的设置项
    • 这些选项不要求强制设置,只有在少数情况下需要配置,不需要的时候可以跳过
    • Bootstrap Port:4724 H5应用测试时需要设置端口
    • Selendroid Port
    • Chromedriver Port
    • Chromedriver Binary Path:驱动设置的路径
  • Edit Configurations:配置环境变量
  • Sava As Presets:保存当前配置到Presets中

    Presets:预设配置

  • 显示高级配置保存的信息
  • 可以配置环境变量

下载安装appium-inspector

高版本Appium(1.22.0及以上)的服务和元素查看器分离,还需要下载Appium Inspector。
启动Appium Server GUI后,搜索按钮鼠标悬停会显示inspectorMoved,低版本会直接显示Start Inspector Session
在这里插入图片描述

https://github.com/appium/appium-inspector/releases
在这里插入图片描述

解压后同appium-sever放在一起
在这里插入图片描述

配置被测设备信息


填写appium:platformName,appium:platformVersion,appium:deviceName等信息。
之后点击save as…进行保存。如果adb连接了模拟器或者真机,也可以点击start session直接运行。

  • 参数

    • deviceName 连接设备名称

      • 通过 adb devices命令获取
        • 在这里插入图片描述
    • platformName 操作系统名称

      • 在这里插入图片描述
    • platformVersion 操作系统版本

    • ——-和软件相关内容——-:

    • appPackage 被测试的APP软件包

      • 获取方式:
        • 找开发要
        • 通过adb命令获取:
          • adb连接成功后:
            • 通过adb shell命令进入adb命令
            • 通过pm list pakages命令查询所有软件包
            • 通过pm list packages -3命令查询第三方软件包(非系统软件包)
            • 在这里插入图片描述
            • 在这里插入图片描述
            • appActivity 被测试的入口
              • 问开发
              • 通过dumpsys window windows | grep current -i命令获取(点击运行待测软件的同时执行此命令)
                • 在这里插入图片描述
            • onRest 是否清除缓存

配置参数后执行

1
2
3
4
5
6
7
8
{
"appium:deviceName": "127.0.0.1:62001",
"platformName": "Android",
"appium:platformVersion": "7.1.2",
"appium:appPackage": "com.tencent.mobileqq",
"appium:appActivity": ".activity.SplashActivity",
"appium:onReset": true
}

在这里插入图片描述

执行后在这里可以获取页面定位元素:
在这里插入图片描述

5. python: pip install Appium-Python-Client

在这里插入图片描述

二、python代码实现

基于selenium实现UI测试

python的自动化代码和appium-inspector不能同时执行
通过执行appium-inspector获取定位元素

1、打开模拟器,adb连接成功
2、打开appium-server–>startServer
3、执行代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from appium import webdriver
from selenium.webdriver.common.by import By
import time

info = {
"appium:deviceName": "127.0.0.1:62025",
"platformName": "Android",
"appium:platformVersion": "7.1.2",
"appium:appPackage": "com.tencent.mobileqq",
"appium:appActivity": ".activity.SplashActivity",
"appium:onReset": True
}

driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", info) # 127.0.0.1:本机地址,4723:appium的端口号,/wd/hub:RemotePath固定写法
driver.implicitly_wait(30) # 隐式等待,等待页面元素加载完成
driver.find_element(By.ID, "com.tencent.mobileqq:id/dialogRightBtn").click()
driver.find_element(By.ID, "com.tencent.mobileqq:id/btn_login").click()
driver.find_element(By.XPATH, "//android.widget.EditText[@content-desc=\"请输入QQ号码或手机或邮箱\"]").send_keys("123456")
driver.find_element(By.ID, "com.tencent.mobileqq:id/password").send_keys("123123")
driver.find_element(By.ID, "com.tencent.mobileqq:id/login")
time.sleep(2)
driver.quit()

基于adb命令实现性能测试

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import subprocess
import os
from numpy import * # 用于取list的平均值

# 方法一:os.system()
# 返回值:返回对应状态码,且状态码只会有0(成功)、1、2。
# 其它说明:os.system()的返回值并不是执行程序的返回结果。而是一个16位的数,它的高位才是返回码。也就是说os.system()执行返回256即 0×0100,返回码应该是其高位0×01即1。所以要获取它的状态码的话,需要通过>>8移位获取。
# def adb_shell(cmd):
# exit_code = os.system(cmd)
# return exit_code>>8
# # # os.system(cmd)命令会直接把结果输出,所以在不对状态码进行分析处理的情况下,一般直接调用即可
# # os.system(cmd)


# # 方法二:os.popen()
# # 返回值:返回脚本命令输出的内容
# # 其它说明:os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被调用。而os.system不同,它只是调用,调用完后自身退出,执行成功直接返回个0。
# def adb_shell(cmd):
# result = os.popen(cmd).read()
# return result


# # 方法三:subprocess.Popen()
# # 返回值:Popen类的构造函数,返回结果为subprocess.Popen对象,脚本命令的执行结果可以通过stdout.read()获取。
# def adb_shell(cmd):
# # 执行cmd命令,如果成功,返回(0, 'xxx');如果失败,返回(1, 'xxx')
# res = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 使用管道
# result = res.stdout.read() # 获取输出结果
# res.wait() # 等待命令执行完成
# res.stdout.close() # 关闭标准输出
# return result


# # 方法四:subprocess.getstatusoutput()
# # 返回值:返回是一个元组,如果成功,返回(0, 'xxx');如果失败,返回(1, 'xxx')
def adb_shell(cmd):
result = subprocess.getstatusoutput(cmd)
return result

# 查看连接的Android设备
cmdDevice = 'adb devices'
returnDevices = adb_shell(cmdDevice)
# print(returnDevices)

# 获取当前打开的最上层软件的activity
cmdStartActivity = 'adb shell dumpsys activity top'
returnStartActivity = adb_shell(cmdStartActivity)[1]
# print(returnStartActivity.split()[3], ": ", returnStartActivity.split()[4])
startActivity = returnStartActivity.split()[4]
# print(startActivity)

# 查看软件启动时间 取平均时间 毫秒
# -S:在启动 activity 前,强行停止目标应用。
# -W:等待启动完成。
cmdStartTime = 'adb shell am start -S -W ' + startActivity
# print(cmdStartTime)
i = 0
startTime = []
while i < 3:
i = i + 1
returnStartTime = adb_shell(cmdStartTime)
# print(returnStartTime)
strStartTime = returnStartTime[1]
# print(type(strStartTime))
listStartTime = strStartTime.split('\n')
for j in listStartTime:
if 'TotalTime' in j:
# print(j)
totalTime = int(j.split('TotalTime: ')[1])
startTime.append(totalTime)
print(startTime)
avgStartTime = mean(startTime)
# startTime.insert(0, avgStartTime)
print('平均启动时间为:', avgStartTime)

在这里插入图片描述

点击查看

本文标题:app自动化:python + appium

文章作者:Mango

发布时间:2023年08月20日 - 14:42:33

最后更新:2023年08月22日 - 15:06:07

原始链接:https://mango185.github.io/post/3cfd6f27.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------