最近工作中遇到游戏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. sparksql 练习题两道

    第一题:select '{"id":1,"name":{"url":"http://xxx/yyy/zz/test.js" ...

  2. linux 如何查找命令的路径(which搜索系统命令,whichis搜索文件)

    http://hi.baidu.com/longredhao/item/911356ea2d8bed3687d9deed linux 下,我们常使用 cd ,grep,vi 等命令,有时候我们要查到这 ...

  3. Python - Tuple 怎么用,为什么有 tuple 这种设计?

    背景 看到有同学很执着的用 tuple,想起自己刚学 python 时,也是很喜欢 tuple,为啥?因为以前从来没见过这种样子的数据 (1,2), 感觉很特别,用起来也挺好用 i,j=(1,2), ...

  4. 最长无重复子串问题 leetcode 3

    一.代码及注释 class Solution { public: int lengthOfLongestSubstring(string s) { int n = s.size(); //字符串的长度 ...

  5. mysql主从之keepalive+MySQL高可用

    一 keepalive介绍 1.1 keepalived 是什么 keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障. 1.2 keepalived 工作原理 keepa ...

  6. mysql主从之基于atlas读写分离

    一 mysql读写分离的概念 写在主库,主库一般只有一个,读可以分配在多个从库上,如果写压力不大的话,也能把读分配到主库上. 实现是基于atlas实现的,atlas是数据库的中间件,程序只需要连接at ...

  7. echarts实现group关系图案例

    官网案例:https://www.echartsjs.com/examples/zh/editor.html?c=graph-simple 自己在项目中实现了两个group图: 1.先看实现效果,两个 ...

  8. Mysql 最全查询语句

    基本查询语句及语法: select distinct from where group by having limit 一.单表查询 前期表与数据准备: # 创建一张部门表 create table ...

  9. JAVA字节码文件之结构

    开发工具:IEDA.JDK1.8.WinHex 一.字节码文件结构 源代码 package com.jalja.java.bytecode; /** * @Auther: XL * @Date: 20 ...

  10. AcWing 244. 谜一样的牛|树状数组

    传送门 题目描述 有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高. 现在这n头奶牛站成一列,已知第i头牛前面有Ai头牛比它低,求每头奶牛的身高. 输入格式 第1行:输入整 ...