当前位置: 首页 > news >正文

selenium用例执行过程采集操作形成测试报告上的回复

在代码执行的过程中不断的进行截图,把截图拼接成gif动态图,放在测试报告上

1、每条用例执行启动一个线程,这个线程会每隔0.3秒进行截图

  • 项目下创建一个临时目录video用来存储所有截图以及gif动态图
  • 封装不断截图的方法,每隔0.3秒进行截图
    # 封装一个普通函数,实现每隔0.3秒截图
    # dr代表核心操作对象
    # worker_id代表当前进程id,主要是用来在多进程并发时区分不同进程下的截图
    def shot(dr,worker_id):
        global shot_flag
        shot_flag = True # 全局变量,用来标识每条用例截图的开始和结束,用例结束后把shot_flag变为fasle
        # 每次截图开始前,清除当前进程下临时图片及gif动态图
        for img in os.listdir(f'{project_path}/video'):
            # img就是拿到的每个文件名称
            if img.startswith(worker_id):
                os.remove(f'{project_path}/video/{img}')
        i = 0
        while shot_flag:
            try:
                dr.get_screetshot_as_file(f'{project_path}/video/{worker_id}_{i}.png')
                time.sleep(0.3)
                i += 1
            except:
                return
  • 没条用例开始执行的时候开启一个线程,执行截图
    @pytest.fixture(scope='function',autouse=True)
    def case_setup(worker_id):
        # 创建线程
        # target表示该线程要执行的动作,只写函数名称就行
        # args指的是要执行这个函数时需要的入参
        thd = threading.Thread(target=shot,args=(DriverOperate.globalDriverOperate,worker_id))
        thd.start()
  • 将图片按照顺序拼接成gif动态图,把当前用例形成的gif动态图放在测试报告上
  • @pytest.fixture(scope='function',autouse=True)
    def case_teardown(worker_id,common_info):
        yield
        global shot_flag
        shot_flag=False
        # 完成当前用例临时图片的拼接,形成gif动态图
        # 1.得到当前用例所有的临时图片名称
        img_list = []# 存储多个图片名称
        # 图片名称规则 gw0_0.png/gw0_1.png/gw0_2.png
        for img in os.listdir(f'{project_path}/video'):
            if img.startswith(worker_id) and img.endswith('.png'):
                img_list.append(img)
    
        # img_list = ['gw0_0.png','gw0_1.png','gw0_11.png','gw0_31.png']
        # 从目录得到的所有图片名称的排序上可能不对,拼接gif必须按照顺序来
        # 因此我们主要针对img_list中的图片名称进行排序
        img_list.sort(key=lambda name: int(name.split('_')[1][:-4]))
        # 完成图片拼接,需要用到一个图片操作的第三方库
        # pip  install pillow -i https://pypi.doubanio.com/simple
        first_img = Image.open(f'{project_path}/video/{img_list[0]}')
        eles_img = [] # 存储除了第一张图以外的其他图片的二进制对象
        for img in img_list[1:]:
            cur_img = Image.open(f'{project_path}/video/{img}')
            eles_img.append(cur_img)
        # 完成拼接
        first_img.save(f'{project_path}/video/{worker_id}_record.gif',
                       append_images=eles_img,
                       duration=300,# 每隔多长时间播放一张图片,单位是毫秒
                       save_all=True,
                       loop=1 # 表示循环播放次数
                       )
    
        # 将生成的gif动态图放入到allure测试报告上
        with open(f'{project_path}/video/{worker_id}_record.gif',mode='rb') as f:
            allure.attach(f.read(),'执行回放',attachment_type=allure.attachment_type.GIF)
        # 每次用例执行结束后,清除当前进程下临时图片及gif动态图
        for img in os.listdir(f'{project_path}/video'):
            # img就是拿到的每个文件名称
            if img.startswith(worker_id):
                os.remove(f'{project_path}/video/{img}')

相关文章:

  • 基于 openEuler 22.09 的 OpenStack Yoga 部署
  • Java 大视界 -- Java 大数据中的联邦学习激励机制设计与实践(111)
  • Git 2.48.1 官方安装与配置全流程指南(Windows平台)
  • Attentive Eraser论文笔记
  • 神经机器翻译:联合学习对齐和翻译
  • ThreadLocal在多线程中传递上下文InheritableThreadLocal
  • IDEA 2025最新版2024.3.3软件安装、插件安装、语言设置
  • Redis实战篇《黑马点评》8 附近商铺
  • 网络编程 day01
  • Linux基础使用和程序部署
  • UI自动化框架介绍
  • sass语法@import将被放弃???升级@use食用指南!
  • 互联网时代如何保证数字足迹的安全,以防个人信息泄露?
  • Jenkins与Flutter项目持续集成实战指南
  • 洛谷————P1634 禽兽的传染病
  • 前端开发的“速度与激情”:ScriptEcho 助力应对 AI 时代的知识焦虑
  • C++(蓝桥杯常考点)
  • 【Java项目】基于SpringBoot的CSGO赛事管理系统
  • SpringMVC中的常用注解和用法
  • 【Transformer优化】什么是稀疏注意力?
  • 华夏幸福:去年营业收入237.65亿元,同比减亏12亿元
  • “光荣之城”2025上海红色文化季启动,红色主题市集亮相
  • 4月人文社科联合书单|天文学家的椅子
  • 西湖大学本科招生新增三省两市,首次面向上海招生
  • 解放日报头版:人民城市共建共享展新卷
  • 李勇已任内蒙古乌兰察布市委副书记,曾在中央编办任职