python appium UI 自动化测试框架讨论

目录

前言:

框架共性总结

Auto_Analysis 权限弹窗识别


前言:

 Python Appium UI自动化测试框架是一种用于测试移动应用程序的工具,它结合了Python编程语言和Appium测试框架的功能。

框架共性总结

1 自动找设备 连接设备
2 自动启 appium server
3 用例框架 unittest pytest
4 用例组织 yml 读 ini 读 excell 或做 html 前端编写
5 用例断言 unittest 的 assert 或是 pytest 或是第三方 asertpy
6 用例报告形式格式 htmltestrunner Allure ExtentReports 等
这个是 Auto_Analysis

7 用例多线程跑 失败重跑机制
8 android 方向自动监控权限弹窗(macaca 有服务参数 permissionPatterns 实现,appium 也可以,Auto_Analysis 在 public.installApp 也实现了一种监控屏幕是否有需要点击的安装按钮 )
9 执行过程异常捕获与 Log 这个 Auto_Analysis 的 log 做的日志非常好,用的是 logging.

10 执行过程性能捕获 是 adb 形式的 还是其他形式的 比如 atx 引入的 gt 还是专业的 appetizer 工具。

以上简单逛论坛发现的一些不错的框架思路和开源实现汇总,每个人的实现和支持都或多或少不一样。开源的我都调通了,大致看了下,各有优劣。
有的我想要的在这个框架,有的我想看到的在另一个框架。总之每个项目都各有优点,又各有劣处。

所以想发起个讨论贴,坛子里的各位 python 大牛,可以来大家一起讨论下。到底共性总结节里提到的,到底用什么实现最好。

Auto_Analysis 权限弹窗识别


Auto_Analysis 在 public.installApp 也实现了一种监控屏幕是否有需要点击的安装按钮 调试了下 发现了这里
在我的小米 mix2 里 安装 demo 的 apk 没法点继续安装, 所以想扩展的话 可以把不同系统的写到这里。
比如安卓原生的就是 com.android*** 而小米 的我发现都是 com.miui***。

先捕获 miui9.2 的安装弹窗 看看到底是啥


原来 package=com.miui.securitycenter resource-id=android:id/button2
看到继续安装与代码里定义的 button4 = 'android:id/button1' 冲突了 ,所以每次都是先点的拒绝(miui9.2 里 拒绝是 android:id/button1)。。。。。

"""
同属性单个元素,返回单个坐标元组
button_list:常见的确认,同意,按钮控件id
"""
button0 = 'com.android.packageinstaller:id/ok_button'
button1 = 'com.android.packageinstaller:id/btn_allow_once'
button2 = 'com.android.packageinstaller:id/bottom_button_two'
button3 = 'com.android.packageinstaller:id/btn_continue_install'
#追加的miui9.2系统 继续安装的package=com.miui.securitycenter  resource-id=android:id/button2  
#这么写没过先放这儿 button4 = 'com.miui.securitycenter:id/android:id/button2'
#button4 = 'android:id/button1'与miui9.2 securitycenter权限安装 继续安装冲突 改为android:id/button2
button4 = 'android:id/button2'
button5 = 'vivo:id/vivo_adb_install_ok_button'
button_list = [button0, button1, button2, button3, button4, button5]

改后完美识别了 miui9.2 的权限安装弹窗

这种方式的 原理 我看了下 是抓取整个界面的 xml 类似 appium 里或 appcrawler 里 getpageresource 然后解析该元素 xml 找到对应的元素操作之。
比其他 appium 找权限弹窗的方案好许多。

附上相关代码:

def main(self):"""开启多线程:线程1:安装应用线程2:获取当前页面是否有可点击的按钮:return:"""ini = U.ConfigIni()install_file = ini.get_ini('test_install_path', 'path')package_name = ini.get_ini('test_package_name', 'package_name')threads = []click_button = threading.Thread(target=self.tap_all, args=())threads.append(click_button)install_app = threading.Thread(target=self.__install_app, args=(package_name, install_file))threads.append(install_app)process_list = range(len(threads))for i in process_list:threads[i].start()for i in process_list:threads[i].join()self.adb.shell('"rm -r /data/local/tmp/*.xml"')@U.l()
def __element(self):"""同属性单个元素,返回单个坐标元组button_list:常见的确认,同意,按钮控件id"""button0 = 'com.android.packageinstaller:id/ok_button'button1 = 'com.android.packageinstaller:id/btn_allow_once'button2 = 'com.android.packageinstaller:id/bottom_button_two'button3 = 'com.android.packageinstaller:id/btn_continue_install'#追加的miui9.2系统 继续安装的package=com.miui.securitycenter  resource-id=android:id/button2  button4 = 'com.miui.securitycenter:id/android:id/button2'#button4 = 'android:id/button1'与miui9.2 securitycenter权限安装 继续安装冲突 改为android:id/button2button4 = 'android:id/button2'button5 = 'vivo:id/vivo_adb_install_ok_button'button_list = [button0, button1, button2, button3, button4, button5]self.__uidump()self.pattern = re.compile(r"\d+")if not os.path.exists(self.all_result_path + "/dump.xml"):U.Logging.warn('Failed to get xml')return Nonetree = ET.ElementTree(file=self.all_result_path + "/dump.xml")tree_iter = tree.iter(tag="node")for elem in tree_iter:if elem.attrib["resource-id"] in button_list:bounds = elem.attrib["bounds"]coord = self.pattern.findall(bounds)x_point = (int(coord[2]) - int(coord[0])) / 2.0 + int(coord[0])y_point = (int(coord[3]) - int(coord[1])) / 2.0 + int(coord[1])return x_point, y_pointelse:return Nonedef tap(self):"""点击动作:return:"""coordinate_points = self.__element()if coordinate_points is not None:self.adb.touch_by_element(coordinate_points)def tap_all(self):"""不间断获取xml,并且点击。配合多线程使用:return:"""while True:self.tap()if not self.queue.empty():break

安装 APP 的时候 那个 main 启动了两个线程一个安装负责安装 apk, 同时另一个监控,先捕获当前安装界面的元素对象树 xml 然后循环去判断是否有元素在__element 定义中, 有的话 就点击。

这个方案 也是捆绑在安装过程中的, 我还是想要那种 ,不管是安装过程中 ,还是 apk 在跑流程用例的过程中, 莫名出来的都能捕获 。

不过可以用这个思路 去改改 。

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)

相信能使你更好的进步!

点击下方小卡片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《数据结构》数据结构概念,顺序表,链表

目录 1. 为什么学习数据结构? 2. 数据结构 2.1. 数据 2.2. 逻辑结构 2.3. 存储结构 2.4. 操作 3. 算法 3.1. 算法与程序 3.2. 算法与数据结构 3.3. 算法的特性 3.4. 如何评价一个算法的好坏 4. 线性表 4.1. 顺序表 4.2. 单向链表 4.3. 单向循环链表&…

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案

1.非注解式实现 2.1使用之前要明确使用的业务场景 例如我们在登录时&#xff0c;可以让redis缓存验证码&#xff0c;又如在分类下显示菜品数据时&#xff0c;我们可以对分类和菜品进行缓存数据等等。 2.2导入Redis相关依赖 <dependency><groupId>org.springfra…

SpringAMQP - 消息传输时,如何提高性能?解决 SQL 注入问题?

目录 一、问题背景 二、从消息转化器根源解决问题 1.引入依赖 2.在服务生产者和消费者中都重新定义一个 MessageConverter&#xff0c;注入到 Spring 容器中 一、问题背景 在SpringAMQP的发送方法中&#xff0c;接收消息的类型是Object&#xff0c;也就是说我们可以发送任意…

DB-Engines排名公布 GBASE南大通用入围国产数据库TOP 3

什么是DB-Engines排名&#xff1f; DB-Engines排名是数据库领域的流行度榜单&#xff0c;它对全球范围内的419款数据库&#xff08;截至2023年7月&#xff09;进行排名&#xff0c;每月更新一次&#xff0c;排名越靠前&#xff0c;则表示越流行。在很多技术选型的场合&#xf…

【idea】idea全局设置Maven配置

Idea版本&#xff1a;2021.1.1 1、点击File->Close project 2、点击Customize->All settings 3、设置Maven

# Linux终端控制字符详解以及简单应用实践

Linux终端控制字符详解以及简单应用实践 文章目录 Linux终端控制字符详解以及简单应用实践1 控制字符表2 控制字符 ESC &#xff08;0x1B&#xff0c;^[&#xff09;子参数表3 控制字符 ESC &#xff08;0x1B&#xff0c;^[&#xff09;子参数表 - 字符颜色参照表4 实践&#x…

Python实现HBA混合蝙蝠智能算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法&#xff0c;是一种搜索全局最优解的有效方法…

2023无监督摘要顶会论文合集

2023无监督摘要顶会论文合集 写在最前面ACL-2023Aspect-aware Unsupervised Extractive Opinion Summarization 面向的无监督意见摘要&#xff08;没找到&#xff09;Unsupervised Extractive Summarization of Emotion Triggers *情绪触发(原因)的 *无监督 *抽取式 摘要&#…

DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程

目标检测系列的算法模型可以说是五花八门&#xff0c;不同的系列有不同的理论依据&#xff0c;DETR的亮点在于它是完全端到端的第一个目标检测模型&#xff0c;DETR&#xff08;Detection Transformer&#xff09;是一种基于Transformer的目标检测模型&#xff0c;由Facebook A…

Redis 从入门到精通【进阶篇】之高可用集群(Redis Cluster)详解

文章目录 0. 前言设计目标核心概念 1. 架构设计和原理1.1. 数据分片2. 节点间通信6. 扩容和缩容 2. 总结3. Redis从入门到精通系列文章4. Redis Cluster面试题4.1. Redis Cluster如何进行扩容和缩容&#xff1f;4.2. Redis Cluster如何进行故障转移&#xff1f;4.3. Redis Clus…

【问题分析解决】git添加.gitignore后不生效问题

一&#xff0c;问题现象 在已经提交过的git管理的项目中&#xff0c;新增加一个.gitignore文件&#xff0c;或者修改.gitignore文件之后&#xff0c;新增的内容不生效。 二&#xff0c;问题原因 因为我们误解了.gitignore文件的用途&#xff0c;该文件只能作用于Untracked F…

JDK JRE JVM

JDK JRE JVM JDKJREJVM三者之间的联系三者之间的区别 JDK JDK是用于开发、编译、调试和运行Java应用程序的软件包&#xff0c;包含了Java编程语言的开发工具和Java运行时环境。JDK包括Java编译器&#xff08;javac&#xff09;、Java虚拟机&#xff08;JVM&#xff09;和Java类…

单轴机器人的结构与特点

单轴机器人是由马达驱动的移动平台&#xff0c;由滚珠螺杆和 U型线性滑轨导引构成&#xff0c;其滑座同时为滚珠螺杆的驱动螺帽及线性滑轨的导引滑块&#xff0c;可用半导体、光电、交通运输业、环保节能产业、精密工具机、机械产业、智慧自动化、生技医疗上。 相对于传统的模组…

django使用channels实现webSocket启动失败

问题描述 使用channels启动ASGI结果却是普通启动&#xff0c;如下&#xff1a; Watching for file changes with StatReloader Performing system checks...System check identified no issues (0 silenced). July 15, 2023 - 18:23:49 Django version 4.2, using settings s…

JavaWeb(3)——HTML、CSS、JS 快速入门

一、JavaScript 运算符 • 赋值运算符&#xff08; &#xff09; 赋值运算符执行过程&#xff1f; 将等号右边的值赋予给左边, 要求左边必须是一个容器 出现是为了简化代码, 比如让 let age 18 &#xff0c;age 加 2 怎么写呢 let age 18age 2console.log(age)age * 2con…

javaee jstl表达式

jstl是el表达式的扩展 使用jstl需要添加jar包 package com.test.servlet;import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import javax.servlet.ServletException; import javax.servlet…

下载编译Chromium

参考&#xff1a;Mac上本地编译Chrome浏览器踩坑笔记&#xff08;2021.02最新&#xff09; - 掘金 For Mac: 一、下载编译工具链&#xff1a;deptool git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH"$PATH:/Users/yumlu/cod…

什么是DevOps监控以及如何在组织中实施?

如今的软件开发商经常面临两大挑战——快速交付和大规模创新。DevOps通过在软件开发生命周期(SDLC)中引入自动化来开发和交付高质量的软件&#xff0c;从而帮助解决这些挑战。 持续集成(CI)/持续部署&#xff08;CD)是DevOps实践中自动化的关键组件。它可以自动化代码构建、测试…

力扣 1005. K 次取反后最大化的数组和

题目来源&#xff1a;https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/ C题解1&#xff1a;最直接的想法就是负的变正的&#xff0c;如果负的元素数量小于k&#xff0c;就挑选绝对值大的负数变正&#xff1b;如果负的元素数量大于k&#xf…

阿里云声音复刻

阿里云声音复刻 个性化人声定制 阿里云个性化人声定制是智能语音交互产品自学习平台下的一部分 使用方式&#xff1a;https://help.aliyun.com/document_detail/456006.html 方式一&#xff1a;控制台界面定制使用方式 方式二&#xff1a;通过OpenAPI定制&#xff1a;在该页…