基于PyAutoGUI图片定位的自动化截图工具--jmeter部分

1、计划

  压测完成后需要编写性能测试报告,报告中所需数据截图较多,使用自动化操作方便快捷,就编写一个界面工具以便后续复用。之前编写过loadrunner报告的自动化截图脚本,现在用jmeter也比较多,就编写jmeter部分,然后两个整合起来。
PyAutoGUI实现对LoadRunner报告自动化截图

2、功能分析

  • 需求:点击需要截图的监听器按钮,指定区域截图保存,对每个jmeter报告循环。
    在这里插入图片描述
  • 工具流程

在这里插入图片描述

3、主体界面设计

  还是使用Qt Designer编辑pyqt的基础界面,使用TabWidget来切换页面,现在先设计jmeter部分。

  1. 左边的监听器与报告展示,使用QTreeWidget展示
    在这里插入图片描述
  2. 修改样式,稍微好看点。
/* 设置表格水平表头(最上面一行) */
QHeaderView::section:horizontal {background-color: rgb(255, 245, 233); /* 色背景 */color: black; /* 文本颜色为黑色 */border: none; /* 隐藏边框 */font: 11pt "微软雅黑";
}
QTreeView {/*border:none;*/border: 1px solid lightgray;outline:0px;background: #FFFFFF;show-decoration-selected: 1;
}
QTreeView::item {height: 30px;border: none;color: black;background: #FFFFFF;
}
QTreeView::item:hover {background: rgb(255, 210, 183);
}
QTreeView::item:selected{background-color: rgb(255, 170, 127);color: #f9ffff;
}

在这里插入图片描述

  1. 右边增加个QGridLayout布局管理器,方便整合按钮输入框等。实现选择报告文件夹、下拉选择报告格式,如:csv、jtl,等功能。
  2. 下面放个TextBrowser,显示日志。
    在这里插入图片描述
# 按钮样式
QPushButton {background-color: #57bd6a;color: #f9ffff;font-size: 20px;font-weight: bold;border-radius: 5px;}QPushButton:pressed {background-color: #4eaa5f;}
  1. 主体界面完成,包含两个选择区域,右边一个按钮区域,下方日志显示区域。
    在这里插入图片描述

4、扫描文件功能实现

  1. 报告文件夹
    增加【选择路径】按钮信号槽,链接select_folder()。点击按钮打开Windows资源管理器窗口,选择文件夹,路径回显到QLineEdit。
    def select_folder(self):"""报告文件夹"""directory = QFileDialog.getExistingDirectory(self, "选择文件夹")self.daoruwenjian.setText(directory)self.show_folder()	# 扫描文件夹

  下面的保存文件夹同理,不同的是增加了默认打开地址【下载文件夹】:

    def report_folder(self):"""选择保存路径,默认下载文件夹"""downloads_folder = QStandardPaths.writableLocation(QStandardPaths.StandardLocation.DownloadLocation)directory = QFileDialog.getExistingDirectory(self, "选择文件夹", downloads_folder)self.report.setText(directory)
  1. 扫描文件夹内报告:

  将扫描到的报告名称与地址放到字典self.file_names,结果显示到日志框里面。
  扫描到了格式文件,就调用select_bg(),显示到页面上。

    def show_folder(self):"""扫描文件夹内报告"""directory = self.daoruwenjian.text()      # 获取路径self.file_names = {}    # 全部报告,名称:地址self.daochulog.clear()  # 清空说明for root, dirs, files in os.walk(directory, topdown=True):    # 遍历文件夹及其子文件夹中的.格式文件for file in files:if file.endswith(f'.{self.geshi.currentText()}'):                   # 条件筛选file_name = os.path.basename(root) + '-' + file      # 获取文件名(含扩展名)self.file_names[file_name] = os.path.join(root, file)count = len(self.file_names)                     # 统计报告数量if count == 0:self.daochulog.append(f'扫描完成----------没有发现.{self.geshi.currentText()}格式的文件')self.mkliebiao_1.clear()else:self.daochulog.append(f'扫描完成----------发现{count}{self.geshi.currentText()}文件')self.select_bg()self.checkBox_bg.setChecked(False)  # 取消全选def select_bg(self):"""显示报告列表"""self.mkliebiao_1.clear()                             # 清除其所有itemfor value in self.file_names.keys():parent_item = QTreeWidgetItem(self.mkliebiao_1)  # 创建父级项目parent_item.setText(0, value)

实现情况:
在这里插入图片描述

5、监听器设置页面

  1. 监听器信息页面设计
    页面填写监听器的名称、截图范围。
    然后对指定范围的按钮,截取识别图像。
    【3.动态高度识别】勾选了,才显示其设置项目。
    相应按钮增加信号槽。在这里插入图片描述
  2. 保存
    保存按钮只保存监听器名称与截图范围,数据量不大就存放到json文件中。
JM_JSON = 'Identify/jm.json'  # jm配置文件路径def save_jm(self):"""监听器,截图范围保存"""if len(self.biaoti.text()) == 0:self.ts.xinxi("请填写名称与截图范围")returndata = {'lisener': (self.spinBox_1.value(),self.spinBox_2.value(),self.spinBox_3.value(),self.spinBox_4.value())}try:if not os.path.exists(JM_JSON):# 文件不存在,直接写入新数据with open(JM_JSON, 'w', encoding='utf-8') as f:json.dump(data, f)else:# 文件存在,读取并合并数据with open(JM_JSON, 'r', encoding='utf-8') as f:existing_data = json.load(f)if self.biaoti.text() not in existing_data:existing_data[self.biaoti.text()] = {}existing_data[self.biaoti.text()].update(data)# 写回更新后的数据with open(JM_JSON, 'w', encoding='utf-8') as f:json.dump(existing_data, f)self.ts.xinxi(f"保存成功")self.name = self.biaoti.text()self.edit()		# 反显信息self.show()except Exception as e:self.ts.xinxi(f"保存出错:{e}")
  1. 信息显示
    这又臭又长
    def edit(self):"""反显编辑页面信息"""self.biaoti.setText(self.name)self.biaoti.setReadOnly(True)       # name 不可编辑self.biaoti.setStyleSheet("""QLineEdit[readOnly="true"] {color: gray;               /* 文本颜色设为灰色 */background-color: #f0f0f0; /* 背景颜色设为浅灰色 */border: 1px solid gray;     边框颜色设为灰色 */}""")with open(JM_JSON, 'r', encoding='utf-8') as f:data = json.load(f)value = data.get(self.name, {})              # 获取name的数据lisener = value.get('lisener', (0, 0, 0, 0))tu1 = value.get('tu1', 0)                     # 识别图tu2 = value.get('tu2', 0)if tu1 != 0 and os.path.exists(tu1):            # tu1t1 = 1self.label_19.setText("已截图")self.label_5.setStyleSheet(f'''background-color: rgb(97, 174, 255);image:url(./{tu1});''')      # 设置图,相对路径self.label_5.show()else:t1 = 0if 'tu1' in value:       # 如果没图片,则删除图片记录del value['tu1']with open(JM_JSON, 'w', encoding='utf-8') as f1:json.dump(data, f1)if tu2 != 0 and os.path.exists(tu2):            # tu2t2 = 1self.label_23.setText("已截图")self.label_7.setStyleSheet(f'''background-color: rgb(97, 174, 255);image:url(./{tu2});''')      # 设置图,相对路径self.label_7.show()else:t2 = 0if 'tu2' in value:       # 如果没图片,则删除图片记录del value['tu2']with open(JM_JSON, 'w', encoding='utf-8') as f1:json.dump(data, f1)self.tu.setCurrentIndex(t1 and t2)  # 设置页面下拉项tu3 = value.get('tu3', 0)                   # 动态高度图 tu3if tu3 != 0 and os.path.exists(tu3):self.checkBox.setChecked(True)self.label_6.setText("")self.label_6.setStyleSheet(f'''background-color: rgb(97, 174, 255);image:url(./{tu3});''')      # 设置图,相对路径self.label_6.show()else:if 'tu3' in value:              # 无图删除记录,按钮不显示del value['tu3']with open(JM_JSON, 'w', encoding='utf-8') as f2:json.dump(data, f2)self.checkBox.setChecked(False)self.label_40.setVisible(False)self.label_6.setVisible(False)self.widget_4.setVisible(False)self.tu3.setVisible(False)for i, value in enumerate(lisener, start=1):spin_box = getattr(self, f"spinBox_{i}")        # 坐标赋值spin_box.setValue(int(value))
  1. 实现情况

在这里插入图片描述

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

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

相关文章

树形查找试题(二叉树、红黑树)

一、单项选择题 01.对于二叉排序树,下面的说法中,()是正确的。 A.二叉排序树是动态树表,查找失败时插入新结点,会引起树的重新分裂和组合 B.对二叉排序树进行层序遍历可得到有序序列 C.用逐点插入法构造二叉排序树,若先…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第三课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,这次有机会参与试用,特记录每次学习情况。 一、课程笔记 本次学习的是RAG(Retrieval Augmented Generation)技术,它是通过检索与用户输入相关的信息片段…

【简单讲解下WebView的使用与后退键处理】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

MySQL操作DML

目录 1.概述 2.插入 3.更新 4.删除 5.查询 6.小结 1.概述 数据库DML是数据库操作语言(Data Manipulation Language)的简称,主要用于对数据库中的数据进行增加、修改、删除等操作。它是SQL语言的一部分,用于实现对数据库中数…

力扣--图论/Prim1584.连接所有点的最小费用

思路分析: 初始化:获取点的数量,并创建两个辅助数组 adjvex 和 lowcost,分别用于记录最小生成树的边信息和每个顶点到最小生成树的距离。Prim算法循环:在每一次循环中,选择一个未加入最小生成树的顶点 k&a…

软考122-上午题-【软件工程】-需求分析

一、软件需求 在进行需求获取之前,首先要明确需要获取什么,也就是需求包含哪些内容。 软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。通常,这些需求包括功能需求、性能需求、用户或人的因素、环境需求、界面需…

科研学习|可视化——相关性结果的可视化

一、相关性分析介绍 相关性分析是指研究两种或者两种以上的变量之间相关关系的统计分析方法,一般分析步骤为: 1)判断变量间是否存在关联;2)分析关联关系(线性/非线性)、关联方向(正相…

Qt中的网络通信

C没有封装专门的网络套接字的类,因此C只能调用C对应的API,而在Linux和Windows环境下的API都是不一样的 Qt作为一个C框架提供了相关封装好的套接字通信类 在Qt中需要用到两个类,两个类都属于network且都是属于IO操作,只不过这两个类…

混合云构建-如何通过Site to Site VPN 连接 AWS 和GCP云并建立一个高可用的VPN通信

如果我们的业务环境既有AWS云又有GCP云,那么就需要将他们打通,最经济便捷的方式就是通过Site-to-Site VPN连接AWS和GCP云,你需要在两个云平台上分别配置VPN网关,并建立一个VPN隧道来安全地连接这两个环境,我们下面演示一个高可用场景下的S2S VPN线路构建,采用动态BGP协议…

Innodb架构解析

整体架构 通过《面试官:一条SQL是如何执行的?》我们了解了MySQL架构,下面我们看下Innodb架构。 innodb最早由Innobase Oy公司开发,5.5版本开始是MySQL默认存储引擎,该存储引擎是第一个完整支持ACID事务的MySQL存储引…

git修改本地提交历史邮箱地址

1、Git(Git) 2、修改Git本地提交历史中的邮箱地址 使用 git rebase 命令进行交互式重置。 具体步骤如下:(https://git-scm.com/docs/git-rebase) 1、查看提交历史: 使用 git log 命令列出提交历史&#x…

弹簧、质量的bode、nyquist与根轨迹图

在控制系统分析中,Bode图、Nyquist图和根轨迹图都是重要的工具,用于评估和分析系统的性能。这些系统的Nyquist图提供了最大的旋转,即它们在频率变化时表现出最大的相位变化。当Nyquist图完全位于虚轴上时,意味着系统的增益&#x…

【学习】移动端兼容性测试有什么方法及重要性

随着移动互联网的快速发展,移动应用程序已经成为人们日常生活中不可或缺的一部分。然而,由于各种移动设备的硬件和软件差异,移动应用程序的兼容性问题也越来越突出。因此,移动端兼容性测试成为了一个重要的环节,它可以…

猝不及防 CCF-B ICPP 2024投稿延期至4月22日提交摘要 机会来了别错过

会议之眼 快讯 第53届ICPP(International Conference on Parallel Processing)即国际并行处理会议将于 2024年 8月12日-15日在瑞典哥特兰岛举行!ICPP是世界上最古老的连续举办的并行计算计算机科学会议之一。它是学术界、工业界和政府的研究…

1572. 【基础赛】涂色(paint)

1572. 【基础赛】涂色(paint) (Input: paint.in, Output: paint.out) 时间限制: 2 s 空间限制: 256 MB 具体限制 题目描述 Introl获得了一个N行的杨辉三角,他将每行中值为奇数的位置涂为了黑色。 Chihiro将提出M次询问,在第L…

C语言强制类型转换

目录 王道ppt总结: ​编辑相关博主文章: 王道ppt总结: 相关博主文章:char范围详解,为什么是-128~127,以及int类型范围详解(整型数据在内存中的存储)_char型和int型数据范围-CSDN博客https://b…

数据分析——数据规范化

数据规范化是数据分析中的一个重要步骤,其目的在于确保数据的一致性和可比性,提高数据质量和分析结果的准确性。以下是一些数据规范化的常见方法和技术: 数据清洗:此步骤主要清除数据中的重复项、空格、格式错误等,确…

微信小程序uniapp+vue电力巡线任务故障报修管理系统2q91t

uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 前端开发:vue 语言:javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/t…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第九套

华为海思校园招聘-芯片-数字 IC 方向 题目分享(共9套,有答案和解析,答案非官方,未仔细校正,仅供参考)——第九套 部分题目分享,完整版获取(WX:didadidadidida313,加我备注&#xff…

套接字通信模型

本文内容主要参考《Android图形显示系统》 套接字也就是socket,一般用于网络中两个主机之间应用进程进行通信,在同一个主机也可以使用套接字完成进程之间的通信。 在图形显示系统中,用到套接字进行通信的地方主要有VSync信号的分发以及输入事…