基于appium的app自动化测试框架
基于appium框架的app自动化测试
App自动化测试主要难点在于环境的搭建,appium完全是基于selenium进行的扩展,所以app测试框架也是基于web测试框架开发的
一、设备连接
(即构建基础的测试环境,保证可以驱动设备进行操作)
0.准备测试环境
1)安装jdk配置java_home环境变量;
2)安装Android SDK(安卓软件开发包)(adb、appt )
3)安装nodejs,并通过npm安装appium
1.获取app包名appPackage
在cmd命令行中输入aapt dump badging +apk包目录

如果提示aapt命令不是内部命令,说明aapt的环境变量配置有问题。

可以直接到android-sdk-windows的安装目录下找到aapt程序,在地址栏中输入cmd,然后在执行上面操作,就可以了。
如果执行脚本出现“no such element: Unable to locate element: {"method":"css selector","selector":"#i1"}
(Session info: webview=39.0.0.0)”原因是不明未解决。一般是在模拟机上会出现这种定位问题,真机没有。

成功的结果是这样的,截图如下:

2.获取app入口appActivity的值
还是在上面的信息中往下找找到如下图的位置,其中name的值就是appActivity的参数值

接下来我们可以启动appium软件,直接启动服务appium-server。

然后,通过以上方法获取关于app模块信息,我们可以尝试写一下脚本驱动appium-server来帮我连接到设备上的app软件。脚本命令如下:

脚本完成后,右键执行一下,会发现appium在不停的刷日志(确保appium和脚本在同一网段即可,不一定在同一台电脑) 这样就证明code-client和appium已经建立了联系,然后我们就可以通过写脚本命令操作设备上的软件了。
如果我们要操作手机上自带的软件/功能,没有办法获取apk包怎么办呢?
答:进入cmd命令行中输入adb logcat |findStr START ,然后操作设备上的功能/软件,在打出的日志中查找第一个START,在其后cmp=后面就是报名appPackage和appActivity

===============================================================================
二、搭建自动化测试框架
1、整体思路:创建基础类实现设备驱动的获取连接
2、创建页面类实现页面中所有的功能元素可被获取调用(代码驱动编写测试用例)
3、创建测试脚本(测试类),编写测试方法调用测试用例
4、创建服务控制类,通过参数配置的方式连接不同的设备
5、创建框架的启动脚本
具体代码如下:
1.创建基础类实现设备驱动的获取连接
1)编写基础类,实例化封装后的appium框架(即Pyapp)
2.创建页面类实现页面中所有的功能元素可被获取调用(代码驱动编写测试用例)
2)编写登录页面类,实现登录页面的功能操作

3)编写单个页面功能的测试方法

4)逐一编写测试功能页面类的相关功能 3.创建测试脚本(测试类),编写测试方法调用测试用例

4.创建服务控制类,通过参数配置的方式连接不同的设备
1)新建yml文件编写测试设备的详细信息

2)创建服务控制类:服务控制类:appium服务的停止、启动、监听;设备驱动的连接启动
class Controller(object):
#读取设备配置文件中的设备信息进行初始化
def __init__(self):
# 通过读取yml文件获取 配置信息
self.conf = Tool().app_data
# 拆分包的信息
self.tester = self.conf.get('tester')
# 拆分手机的信息
self.devices = self.conf.get('devices')
# 手机的类型
self.device_type = self.conf.get('device_type')
# 唯一手机
self.device = self.devices.get(self.device_type)[0]
# 手机名称
self.deviceName = self.device.get('name')
#启动appium服务,由于我们是代码驱动,就不能使用手工开启appium
def start_server(self):
device = self.devices.get(self.device_type)[0]
ip = device.get('ip')
port = device.get('port')
deviceName = device.get('deviceName')
log = os.path.join(LOGPATH, device.get('name') + '.log')
cmd = 'appium -a {ip} -p {port} -U {deviceName} -g {log}'.format(
ip=ip, port=port, deviceName=deviceName, log=log)
logger.debug('启动服务的命令:%s'%cmd)
# 执行命令 netstat -ano | findstr 9036 -- netstat -nlpt |grep 9036
subprocess.Popen(cmd, stdout=open(log, 'a+'), stderr=subprocess.PIPE, shell=True)
#监听appium服务是否启动成功
def test_server(self):
port = self.devices.get(self.device_type)[0].get('port')
while True:
#在cmd命令行中执行netstat -ano |findstr 端口,监听服务是否启动成功
res = subprocess.getoutput("netstat -ano | findstr %s" % port)
if 'LISTENING' in res:
logger.debug(res)
logger.info("服务启动成功")
break
else:
time.sleep(3)
logger.debug('三秒后重试')
return True
#开启手机启动的连接
def start_driver(self):
# 包信息 和 手机信息 合并
self.tester.update(self.device)
ip = self.tester.get('ip')
port = self.tester.get('port')
driver = webdriver.Remote('http://{ip}:{port}/wd/hub'.format(ip=ip,port=port),self.tester)
# 像对列中put生成的drvier
driver_queue.put(driver)
#关闭appium服务
def kill_server(self):
res = subprocess.getoutput("taskkill /F /IM node.exe /t")
logger.debug('kill server :%s'%res)
if __name__ == '__main__':
contorller = Controller()
contorller.kill_server()
contorller.start_server()
if contorller.test_server():
contorller.start_driver() 5.创建框架的启动脚本
主要负责启动appium服务、启动设备驱动连接设备、执行测试用例、生成测试报告。 详细代码:
class Main(object):
def __init__(self):
self.controller = Controller()
self.deviceName = self.controller.deviceName def run(self):
self.controller.start_server()
if self.controller.test_server():
self.controller.start_driver()
suite = unittest.TestSuite()
cases = unittest.defaultTestLoader.discover(APPCASE)
for case in cases:
suite.addTest(case)
f = open(APPREPORT.format('{}.html'.format(self.deviceName)), 'wb')
runner = HTMLTestRunner(f, verbosity=1, title=u'测试报告', description=u'用例执行情况:')
runner.run(suite)
f.flush()
f.close() if __name__ == '__main__':
m = Main()
m.run() ============================================================================== 三、编写测试用例过程中常见的问题:
1.如果运行以上脚本后,提示“无法与计算机取得联系” 一般原因有两个(1.appium未开启,2.appium服务和脚本服务不在一个网段内。)
2. 有时候联系两次运行脚本会出现“A new session could not be created. Details” 原因是:appium-server和code-client已经连接,无法再去连接。这里我们可以将appium-server服务关闭然后在新建一个appium-server。在执行脚本就好了。 主要原因是selenium的版本问题,可是使用set_value()代替send_keys()方法。
基于appium的app自动化测试框架的更多相关文章
- 基于Appium的APP自动化测试基础--美团APP的实例
转:https://blog.csdn.net/Tigerdong1/article/details/80159156 前段时间用一种流行语言,一个主流工具,一个实用框架,写了一个美团app自动化测试 ...
- 通过实例介绍Android App自动化测试框架--Unittest
1.为什么需要使用框架实现自动化测试 作为测试工程师,可能在代码能力上相比开发工程师要弱一点,所以我们在写脚本的时候就会相对容易的碰到更多的问题,如果有一个成熟的框架供给我们使用的话,可以帮助我们避免 ...
- 初识Android App自动化测试框架--Unittest
1.为什么需要使用框架实现自动化测试 作为测试工程师,可能在代码能力上相比开发工程师要弱一点,所以我们在写脚本的时候就会相对容易的碰到更多的问题,如果有一个成熟的框架供给我们使用的话,可以帮助我们避免 ...
- 广深小龙-基于unittest、pytest自动化测试框架之demo来学习啦!!!
基于unittest.pytest自动化测试框架之demo,赶紧用起来,一起学习吧! demo分为两个框架:①pytest ②unittest demo 中 包含 web.api 自动化测试框架 ...
- 主流App自动化测试框架对比
1.主流App自动化测试框架对比 2.Appium自动化测试框架 官方网址:http://appium.io/ 跨架构:支持原生.混合以及web移动应用 跨平台:Android & I ...
- Python appium搭建app自动化测试环境
appium做app自动化测试,环境搭建是比较麻烦的. 也是很多初学者在学习app自动化之时,花很多时间都难跨越的坎. 但没有成功的环境,就没有办法继续后续的使用. 在app自动化测试当中,我们主要是 ...
- App自动化测试框架学习探索--从零开始设计
App自动化测试框架学习探索--从零开始设计---持续更新中,敬请关注 1 批量执行app自动化测试使用多线程设计思路: 1)并发级别选择用methods 2)采用@Test多线程,数据提供类dp单线 ...
- Windows下部署Appium教程(Android App自动化测试框架搭建)
摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,a ...
- 移动APP自动化测试框架
简介 移动APP的UI自动化测试长久以来一直是一个难点,难点在于UI的”变”, 变化导致自动化用例的大量维护.从分层测试的角度,自动化测试应该逐层进行.最大量实现自动化测试的应该是单元测试,最容易实现 ...
随机推荐
- jQuery中表单的常用操作(全选、反选)
表单的全选.反选操作一 <form method="post" action=""> 你爱好的运动是?<input type="ch ...
- 各种推导式<"一行能解决的事,为什么要用那么多行">
一.推导式 1.列表:[结果 for循环 条件筛选] 2.字典:{k:v for循环 条件筛选} 3.集合推导式{k for循环 条件筛选} ???为什么没有元组推导式 二.生成器表达式(元组表达式) ...
- Python is 和 == 的区别, 编码和解码
一.is 和 == 的区别 is : 进行比较,比较的是内存地址是否一致 ==:进行比较,比较的是值是否相等 1.小数据池: 数字小数据池范围 -5~256 字符串中如果有特殊字符则他们的内存地址不一 ...
- Python常用模块(四)
一.re模块 正则表达式时计算机科学的一个概念,正则表达式通常被用来检索,替换那些符合某个模式的文本,大多数程序设计语言都支持利用正则表达式进行字符串操作. 正则就是用一些具有特殊含义的符号组合到一起 ...
- DXperience Winforms新版本13.2功能预览
据界面控件厂商 DevExpress 官方最新消息,大家期盼已久的DXperience 13.2终于要面世了.今天在这里提前跟大家提前披露一下DXperience Winforms 13.2的一些精彩 ...
- Bucking the stigma (留学生请摘掉有色眼镜看社区大学)
Many Chinese students second-guess the benefits of attending a US community college. 很多中国学生对去美国社区大学学 ...
- MySQL的基础(优化)1
1,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小 2,在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值 3,对于某 ...
- 金庸的武侠世界和SAP的江湖
2018年10月30日晚,成都地铁一号线,Jerry手机app上突然弹出来一条金庸去世的新闻. Jerry识字很早,小学一年级就开始蹭我父亲的<射雕英雄传>看了.小时候,我爸工作的车间里有 ...
- eplise中运行提示 A fatal error has been detected by the java runtime environment
今天一同事出现运行项目时,提示 A fatal error has been detected by the java runtime environment,具体表现是使用我们框架,不能正常的打印日 ...
- 缓冲区溢出实战教程系列(三):利用OllyDbg了解程序运行机制
想要进行缓冲区溢出的分析与利用,当然就要懂得程序运行的机制.今天我们就用动态分析神器ollydbg来了解一下在windows下程序是如何运行的. 戳这里看之前发布的文章: 缓冲区溢出实战教程系列(一) ...