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

目录

前言:

框架共性总结

[Auto_Analysis 权限弹窗识别](#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/button2
    button4 = '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 None

    tree = 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_point
    else:
        return None

def 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自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)

相信能使你更好的进步!

点击下方小卡片

相关推荐
Hylan_J2 小时前
【VSCode】MicroPython环境配置
ide·vscode·python·编辑器
月光水岸New2 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6752 小时前
数据库基础1
数据库
软件黑马王子2 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
莫忘初心丶2 小时前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
我爱松子鱼2 小时前
mysql之规则优化器RBO
数据库·mysql
闲猫2 小时前
go orm GORM
开发语言·后端·golang
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto3 小时前
how to export a table in sqlite, and import into another
数据库·sqlite