基于Appium自动化测试框架,开发APP自动化测试框架,使APP自动进行测试活动。结果以Excel形式输出;
脚本可执行平台为Windows/Mac,支持Android/iOS;
支持多手机并发执行,不限手机型号及数量;
Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。原生的应用是指用android或ios的sdk编写的应用,移动网页应用是指网页应用,类似于ios中safari应用或者Chrome应用或者类浏览器的应用。混合应用是指一种包裹webview的应用,原生应用于网页内容交互性的应用。 重要的是Appium是跨平台的,何为跨平台,意思就是可以针对不同的平台用一套api来编写测试用例。
Appium遵循下面几个原则(其实也是appium的特点):
- 使用自动化来测试一个app,但是不需要重新编译它
- 写自动化case,不需要学习特定的语言
- 一个自动化框架不需要重复造轮子
- 一个自动化框架需要开源,在精神和实践上实现开源
为了遵循上面的原则,appium的解决方法分别如下: 第一条:采用底层驱动商提供的自动化框架。
IOS:苹果的UIAutomation Android 4.2+:谷歌的 UiAutomator Android 2.3+:谷歌的Instrumentation(已被selendroid取代)
第二条:采用底层驱动商提供统一API,就是WebDriver API。
WebDriver(也称Selenium WebDriver)其实是一个C/S架构的协议,叫做JSON Wire Protocol。通过这个协议,用任何语言写成的客户端都可以发送HTTP请求给服务器。这就意味着你可以自由选择你想要使用的测试框架和执行器,也可以将任何包含HTTP客户端的库文件加入到你的代码中。换句话说,Appium的WebDriver不是一个技术上的测试框架,而是一个自动化库。
第三条:因为WebDriver是一个非常成熟的网页协议且已经正在起草W3C的标准。我们为什么还要创造其他东西呢?相反,我们在WebDriver的基础上,扩展了一些适合移动端自动化协议的API。
第四条:你之所以能读到这篇文章,就是因为我们开源啦。
-
安装node.js
node.js官方网站:https://nodejs.org/Tips:
node建议使用版本为v4.5.0,若使用最新版可能会存在错误。
node v4.5.0下载地址: https://nodejs.org/dist/v4.5.0/ -
安装Appium
Appium官方网站:http://appium.io/Tips:
Appium建议使用版本为v1.4.16(Windows),v1.7.1(Mac),建议使用最新版本。
安装教程参考:https://www.cnblogs.com/fnng/p/4540731.html
-
cmd输入appium-doctor错误提示:“appium不是内部或外部命令”
- 假设Appium安装路径为C:\Program Files (x86)\Appium
在path变量添加C:\Program Files (x86)\Appium\node_modules\.bin\之后关掉cmd重新打开,再输入appium-doctor即正常。
- 假设Appium安装路径为C:\Program Files (x86)\Appium
-
本脚本只针对真机测试,上步参考教程只需参考章节如下:
- Appium移动自动化测试(一)--安装Appium
- Appium移动自动化测试(二)--安装Android开发环境
- Appium移动自动化测试(四)--one demo
- 第四节 安装Appium Client
- 将多部待测手机接入PC,脚本自动识别接入PC手机数量,读取手机所需信息,脚本GetPhoneInfo_Android,GetPhoneInfo_iOS。
Android: adb devices -l
# 系统版本号 #
command = "adb -s %s shell getprop ro.build.version.release" % v["udid"]
# 设备型号 #
command = "adb -s %s shell getprop ro.product.model" % v["udid"]
# 系统名称 IOS/ANDROID #
command = "adb -s %s shell getprop net.bt.name" % v["udid"]
# 设备分辨率 #
command = "adb -s %s shell dumpsys window displays" % v["udid"]
dpi = re.findall("init=(.+?) ", os.popen(command).read())[0].split("x")
iOS: idevice_id -l
phone_index = {"iPhone7,2": {"name": "iPhone6", "dpi": [1334, 750]},
"iPhone8,1": {"name": "iPhone6s", "dpi": [1334, 750]},
"iPhone8,2": {"name": "iPhone6sPlus", "dpi": [1920, 1080]},
"iPhone6,1": {"name": "iPhone5s", "dpi": [1136, 640]}}
phone_info = os.popen("ideviceinfo -u %s" % k).read()
# 系统版本号 #
device[k]["platformVersion"] = re.findall("ProductVersion: (.+)", phone_info)[0]
# 设备型号 #
device_name = re.findall("ProductType: (.+)", phone_info)[0]
device[k]["model"] = device[k]["deviceName"] = phone_index[device_name]["name"]
# 系统名称 IOS/ANDROID #
device[k]["platformName"] = "iOS"
# 设备分辨率 #
device[k]["dpi"]['height'] = phone_index[device_name]["dpi"][0]
device[k]["dpi"]['width'] = phone_index[device_name]["dpi"][1]
-
根据手机数量拉起对应数量进程,1部手机对应2个进程,一进程负责启动、检测、重启Appium服务LaunchAppiumServices。另一进程负责测试用例的执行WaitCase。
-
依次执行测试用例,用例执行结束输出测试结果,输出目录./report/xls_report/启动测试日期时间/
-
启动测试前需对配置文件进行修改,包括待测设备、APP、手机。
-
待测设备
-
APP
-
手机
-
-
修改配置文件完毕,选择待测用例。
-
运行Main.py,开始自动化测试活动。初始框架为死循环While True,自行修改测试次数。
将Unicode显示格式转换成中文显示
-
使用driver.page_source命令,得到APP页面源码,源码中文部分都是Unicode格式显示,可读性差。
-
将源码拷贝至page.html,使用代码编辑工具(pycharm等)格式化代码,使代码有层级关系。
-
运行change_name.py,page.html文件中Unicode中文格式会变成中文显示。
使用交互式解释器(ipython等)调试框架代码
- 对代码进行调整后再次运行需要重启Appium服务,耗时长,提炼框架关键代码,组成调试工具。
class WidgetTest(WidgetOperation): // 初始化
class b(WidgetTest): // 用例代码复制
class fix(WidgetTest): pass WidgetTest = fix // 利用继承关系修改函数内容