最近工作中遇到游戏APP需要实现UI自动化测试,这个app中真的是典型的混合App,有Android原生控件,有webview控件,以及游戏操作页面。研究了Appium,发现appium实现跨应用操作很困难,研究了好几天也没找到实现的方法。后来在公司大佬的带领下,接触到了atx这个自动化的框架。今天来说一下,使用atx,uiautomator2,pytest,selenium 来实现混合App的UI自动化及生成测试报告。
一、环境准备
本人使用的是系统是Mac,所以接线来的都是在Mac电脑上进行的。
1、安装adb,并将adb配置到环境变量中。具体请查看:https://blog.csdn.net/qq_26287435/article/details/81513649
2、安装pytest
 # 安装
pip install -U pytest
# 查看安装版本
pip show pytest
# 或者
pytest --version
pytest的使用方法请自行查看:https://www.jianshu.com/p/75c27fe23b4e
3、安装uiautomator2
pip install --pre -U uiautomator2 #默认安装最新版本
pip install uiautomator2=0.1.11#指定版本安装
我使用的是0.1.11版本的,安装的时候指定版本:

4. 设备安装atx-agent
首先设备连接到PC,并能够adb devices发现该设备。

# 从github下载atx-agent文件,并推送到手机。在手机上安装包名为`com.github.uiautomator`的apk
$ python -m uiautomator2 init
success
看到success ,代表atx-agent初始化成功。手机上会出现一个小汽车图标的应用。
5.安装selenium
pip install selenium 
6.安装控件定位工具
weditor beta 针对Android和iOS原生应用快速定位元素,自动生成代码。

安装方式:

pip install --pre weditor
7.安装截图工具:
在进行游戏时,游戏界面的元素是无法使用原生的控件进行定位的,所以需要用到atx基于图片识别的方式来定位游戏控件。
截图工具使用方式:
python -m atx gui
二、UI自动化实现
接口描述了操作手机APP的各种方法。
1、废话不多说,直接上代码:

 # -*- coding: utf-8 -*-

 import atx
import os
from PIL import Image
import pytest
import allure
from allure_commons.types import AttachmentType
from logzero import logger
from uiautomator2 import UiObjectNotFoundError
# from base.chromedrvier import ChromeDriver
from atx.ext.chromedriver import ChromeDriver ISMAC = 1
TIMEOUT = 10
@allure.step("{0}")
def connect_phone(devices):
global package_name,main_activity
# devices = "D6JNOV5PCANFAURW"
logger.info("连接:" + devices)
package_name = 'com.netease.cloudmusic'#网易云音乐APP的包名
main_activity = ".activity.LoadingActivity" #网易云音乐的activity
d = atx.connect(devices)#手机的devices name
d.start_app(package_name, main_activity)#启动网易云音乐app
return d @allure.step("{1}")
def click_text(atx_conn, action_m, text, timeout=TIMEOUT):
"""
点击安卓原生的控件
:param atx_conn:atx实例
:param action_m:执行的行为描述
:param text:需要查找的按钮的文本
:param timeout:等待
:return:
""" logger.info(action_m)
atx_conn(text=text).click(timeout=timeout)
report_jietu(atx_conn,action_m)#截图 @allure.step("{1}")
def click_id(atx_conn, action_m, id, timeout=TIMEOUT):
""" :param atx_conn: 连接实例
:param action_m: 操作描述
:param id: resureid
:param timeout: 超时时间
:return:
"""
logger.info(action_m)
atx_conn(resourceId = id).click(timeout=timeout)
report_jietu(atx_conn,action_m)#截图 def report_jietu(atx_conn,action_m):
"""
截图
:param atx_conn:atx实例
:param action_m:action_m,被用作图片名称
:return:
"""
image = screenshot(atx_conn,action_m)#截图
with open(image,"rb") as f :
file = f.read()
allure.attach(action_m,file,allure.attach_type.PNG)#截图附件 def screenshot(atx_conn,url):
"""
截图
:param atx_conn:atx实例
:param url:url,被用作图片名称
:return:
""" path = os.path.abspath(os.path.dirname(os.getcwd()))
if ISMAC:
path = path + "/report/image/%s.png" % (url)
else:
path = path + "\\report\\image\\%s.png" % (url)
imgname = path
atx_conn.screenshot(imgname)
img(imgname)
return imgname def img(image):
"""
对图片进行压缩,覆盖原图进行保存
:param image: 图片路径
:return:
""" im = Image.open(image)
# 获得图像尺寸
w, h = im.size
# print('原图尺寸: %sx%s' % (w, h))
# 缩放到25%:
im.thumbnail((w // 4, h // 4))
# 把缩放后的图像用jpeg格式保存:
im.save(image) @allure.feature('网易云音乐')
class Test_misuc(object):
@allure.story('进入每日推荐,点击播放第一首歌曲')
def test_meirituijian(self):#进入每日推荐,点击播放第一首歌曲
d = connect_phone("D6JNOV5PCANFAURW")#连接手机,启动云音乐
click_text(d,"点击每日推荐","每日推荐")#点击每日推荐
click_text(d,"点击播放全部","播放全部")#点击播放全部
click_id(d,"点击暂停播放按钮","com.netease.cloudmusic:id/tr")#点击暂停播放按钮
d.stop_app(package_name) #关闭云音乐 @allure.story('进入我喜欢的音乐,将第一首歌分享给好友')
def test_share(self):#分享歌曲给好友
d = connect_phone("D6JNOV5PCANFAURW")#连接手机,启动云音乐
click_text(d,"点击我的","我的")
click_text(d,"点击我喜欢的音乐","我喜欢的音乐")
click_id(d,"点击更多","com.netease.cloudmusic:id/a")
click_text(d,"点击分享","分享")
click_text(d,"点击分享微信好友","微信好友")
# driver = ChromeDriver(d).driver() #启动selenium 如果是webview页面的话,需要启动selenium,然后根据selenium的定位方式查找元素
click_text(d,"分享给唯安格","唯安格")
click_text(d,"点击分享","分享")
click_text(d,"点击返回网易云音乐","返回网易云音乐")
d.stop_app(package_name) if __name__ == '__main__':
a = Test_misuc()
a.test_meirituijian()
a.test_share()

运行上面代码并生成测试报告:

运行用例: py.test test_aa.py -s --alluredir ./reports
生成报告:allure generate --clean reports

其他工具启动:

启动weditor :python3 -m weditor
uiautomator2 初始化:python3 -m uiautomator2 init
启动atx gui: python3 -m atx gui
指定用例运行:py.test test_ddz.py::TestClass::test_share --alluredir ./reports

2、查看测试报告:执行完:allure generate --clean reports

命令之后,会在当前文件夹生成:allure-report文件夹,该文件下会有一个index.html的文件,只用浏览器打开index.html文件,可以查看生成的测试报告。

如下图:

allure生成测试报告的方法请看官方文档:https://docs.qameta.io/allure/#_pytest

参考:

atx测试框架实现手机应用UI自动化测试的更多相关文章

  1. 基于APPIUM测试微信公众号的UI自动化测试框架(结合Allure2测试报告框架)

    框架初衷 前两周组内的小伙伴跟我说她现在测试的微信公众号项目(保险)每次上新产品时测试起来很费时,存在大量的重复操作(点点点),手工测试每个产品可能需要半天到一天的时间,复杂的产品需要两天. 由于保险 ...

  2. Ui自动化测试框架

    为了提高我们的UI测试效率,我们引用Ui自动化测试框架,这里简单先描述一下,后续会详细补充: 了解一个测试框架,我们就需要了解一下源码,能看懂源码即可: 1.稳定先封装wait EC,电脑性能配置较好 ...

  3. 常用的自动化测试框架及测试框架的发展(Alpha)

    前言:自动化测试在过去的20年已经有了很大的发展.最初的测试工具只提供了简单的捕捉/回访功能,维护性较差.而且脚本工具实现需要很强的开发技术和经验,而且数量众多的测试脚本加上没有文档记录因此维护起来较 ...

  4. Selenium 4 Java的最佳测试框架

    几十年来,Java一直是开发应用程序服务器端的首选编程语言.尽管JUnit一直在与开发人员一起帮助他们进行自动化的单元测试,但随着时间的推移和测试行业的发展,特别是伴随着自动化测试的兴起,已经开发了许 ...

  5. UI自动化测试、接口测试等自动化测试策略

    今天跟大家介绍UI测试.接口测试.单元测试主要内容,以及每种测试花费时间讨论.UI测试[Selenium]UI测试是最接近软件真实用户使用行为的测试类型.通常是模拟真实用户使用软件的行为,即模拟用户在 ...

  6. Google推出iOS功能性UI测试框架EarlGrey

    经过了一段时间的酝酿后,Google很高兴地宣布了EarlGrey,一款针对于iOS的功能性UI测试框架.诸如YouTube.Google Calendar.Google Photos.Google ...

  7. APP的UI自动化测试框架及平台化探索

    顾铮,10年+测试及测试开发相关经验,2014年加入京东,曾主导设计开发UI测试框架,参与CI测试平台建设,现负责iOS侧的工具,框架建设.在UI自动化,性能测试,单元测试方面有较深入研究,在App, ...

  8. 自动化测试中级篇——LazyAndroid UI自动化测试框架使用指南

    原文地址https://blog.csdn.net/iamhuanggua/article/details/53104345 简介   一直以来,安卓UI自动化测试都存在以下两个障碍,一是测试工具Mo ...

  9. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

随机推荐

  1. TestStand 界面重置【小技巧】

    有几种情况可能会使用到这个功能: (1)当界面调整的很乱的时候 (2)当界面突然消失的时候(但是软件进程还在)--快捷键 Alt+V 会弹出菜单,再点击Reset UI Configuration即可 ...

  2. 简易数据分析 15 | Web Scraper 高级用法——CSS 选择器的使用

    这是简易数据分析系列的第 15 篇文章. 年末事情比较忙,很久不更新了,后台一直有读者催更,我看了一些读者给我的私信,发现一些通用的问题,所以单独写篇文章,介绍一些 Web Scraper 的进阶用法 ...

  3. 记一次ftp错误

    在一个ftp上,突然登不上 报错,使用浏览器登录,报此用户不是私密连接,然后使用服务器客户端登录尝试,错误信息如下: [root@test ~]# ftp *.*.*.* Connected to * ...

  4. 20191031-3 beta week 1/2 Scrum立会报告+燃尽图 03

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9913 git地址:https://e.coding.net/Eustia ...

  5. 从头学pytorch(十一):自定义层

    自定义layer https://www.cnblogs.com/sdu20112013/p/12132786.html一文里说了怎么写自定义的模型.本篇说怎么自定义层. 分两种: 不含模型参数的la ...

  6. 【题解】有标号的DAG计数3

    [HZOI 2015] 有标号的DAG计数 III 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln), ...

  7. 洛谷$P3645\ [APIO2015]$雅加达的摩天楼 最短路

    正解:最短路 解题报告: 传送门$QwQ$ 考虑暴力连边,发现最多有$n^2$条边.于是考虑分块 对于长度$p_i$小于等于$\sqrt(n)$的边,建立子图$d=p_i$.说下关于子图$d$的定义? ...

  8. $[SHOI2007]$ 园丁的烦恼 二维数点/树状数组

    \(Sol\) 设一个矩阵的左上角为\((x_1,y_1)\),右下角为\((x_2,y_2)\),\(s_{x,y}\)是到\((1,1)\)二维前缀和,那么这个矩阵的答案显然是\(s_{x_2,y ...

  9. centos 7.3 服务器环境搭建——MySQL 安装和配置

    centos 7.3 服务器环境搭建——MySQL 安装和配置服务器信息如下:服务器:阿里云系统 centos 7.3 (阿里云该版本最新系统)mysql版本:5.7.18 (当前时间最新版本)连接服 ...

  10. 极光推送SDK通过泰尔终端实验室检测,符合统一推送接口标准

    1月7日,中国深圳--国内领先的开发者服务提供商极光(Aurora Mobile, NASDAQ:JG)宣布其旗下产品极光推送SDK通过中国信息通信研究院泰尔终端实验室的检测,其性能和接口标准符合统一 ...