基于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.mzph.cn/news/807704.shtml

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

相关文章

3V升9V3串LED驱动恒流WT7012

3V升9V3串LED驱动恒流WT7012 WT7012是一款性能卓越的升压转换器,设计用于驱动多达七串的白光LED。该器件具备宽输入工作电压范围(2-24V),使其在单节或多节锂电池供电的应用中能够稳定提供背光。WT7012支持从3V起升至6V、9V、12V的恒流输出,通…

sqlserver问题记录

今天在利用sql查询数据时出现如下错误 在执行批处理时出现错误。错误消息为: 引发类型为“System.OutOfMemoryException”的异常。 症状 使用 SSMS 运行返回大量数据的 SQL 查询时,会收到类似于以下内容的错误消息: 执行批处理时出错。 错误消息为&…

Linux基础指令补全,权限问题分析—3

一、命令补全: 1.bc指令: 功能:命令行计算器,使用quit退出语法:bc 算式 2.uname指令: 语法:uname 选项功能:uname原来获取电脑或操作系统的相关信息选项: ①-a选项&am…

【IC前端虚拟项目】验证阶段开篇与知识预储备

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 从这篇开始进入验证阶段,因为很多转方向的小伙伴是转入芯片验证工程师方向的,所以有必要先做一个知识预储备的说明,或者作为验证入门的一个小指导吧。 在最开始&#…

如何做好2024年中央企业内部控制体系建设与监督工作

面对日益复杂的经济环境和全球一体化的挑战,中央企业作为国家经济的中流砥柱,必须不断提升内部控制体系的建设与执行水平。随着2024年的脚步逼近,中央企业需围绕国家宏观政策,积极采纳智能化技术,强化内控体系&#xf…

Redis 的数据结构和内部编码

Redis的 5 种数据类型 Redis 底层在实现上述数据结构的时候,会在源码层面,针对上述实现进行 特定的优化 ,来达到节省时间/节省空间效果 特定的优化:内部的具体实现的数据结构,在特定场景下,不是其对应的标准…

运动控制卡/运动控制器的ZCAN总线ZMIO310扩展模块使用

本节课程主要分为八个部分给大家讲解ZCAN扩展模块的使用,分别是: 一、ZMIO310系列扩展模块介绍 二、ZMIO310-CAN通讯模块的接线 三、ZMIO310-CAN通讯模块介绍及拨码开关设置 四、ZMIO310子模块接线参考 五、ZMIO310-CAN扩展模块功能验证 六、ZMIO3…

新手怎么正确地做抖音小店?入门级教程来了,建议认真阅读!

大家好,我是电商糖果 新手做抖音小店,不懂小店的运营,总是容易走弯路,踩坑。 糖果这里就给大家带来,新手正确的入门级运营教程。 近期刚开店的朋友,建议认真阅读! 第一步:基础后台…

探索艺术的新领域——3D线上艺术馆如何改变艺术作品的传播方式

在数字化时代的浪潮下,3D线上艺术馆成为艺术家们展示和传播自己作品的新平台。不仅突破了地域和物理空间的限制,还提供了全新的互动体验。 一、无界限的展示空间:艺术家的新展示平台 3D线上艺术馆通过数字化技术,为艺术家提供了一…

Java List基础篇

目录 前言一、常用List1.1 List1.1.1 特点1.1.2 常用API 1.2 ArrayList1.2.1 特点1.2.2 使用 1.3 LinkedList1.3.1 特点1.3.2 使用 1.4 CopyOnWriteArrayList1.4.1 特点1.4.2 使用 1.5 Arrays.asList()1.5.1 特点1.5.2 使用 二、对比总结 前言 一、常用List 1.1 List List是…

JUC常用辅助类

一、CountDownLatch 1.原理 它内部维护了一个计数器,该计数器初始化时设定一个数值,表示需要等待的线程数量。每个线程执行完特定任务后会调用CountDownLatch的countDown()方法,该方法会将计数器减一。同时,另外一个或多个线程可…

Acrel-1000DP光伏监控系统 的应用 安科瑞 许敏

摘 要:分布式光伏发电特指在用户场地附近建设,运行方式多为自发自用,余电上网,部分项目采用全额上网模式。分布式光伏全额上网的优点是可以充分利用分布式光伏发电系统的发电量,提高分布式光伏发电系统的利用率。发展分…

题目 2348: 信息学奥赛一本通T1436-数列分段II【二分答案】

信息学奥赛一本通T1436-数列分段II - C语言网 (dotcpp.com) #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define int long long const int N1e5100; const int inf1e9; int n,m; int a[N]; bool check(int mid) {int s…

ELK、ELKF企业级日志分析系统介绍

前言 随着企业级应用系统日益复杂&#xff0c;随之产生的海量日志数据。传统的日志管理和分析手段&#xff0c;难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下&#xff0c;ELK日志分析系统应运而生。"Elastic" 是指 Elastic 公司所提供的一系列与搜索…

总体标准差、样本标准差、标准误(标准误差)

下面是样例&#xff1a; 参考文章如何做好SCI论文中的标准误差图 - 知乎 (zhihu.com)

第十四篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化处理图像

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python自动化图像处理的优点介绍二、Python常用图像处理库和功能介绍三、强大且易于上手示例代码四、丰富的算法资源示例代码五、批量处理图片示例代码六、支持多种图像格式示例代码七、…

【LeetCode】单调栈类题目详解

所有题目均来自于LeetCode&#xff0c;刷题代码使用的Python3版本 单调栈 通常针对一维数组的问题&#xff0c;如果需要寻找一个元素右边或者左边第一个比自己大或者小的元素的位置&#xff0c;就可以使用单调栈&#xff0c;时间复杂度为O(n) 单调栈的本质是空间换时间&#…

Linux内核中常用的C语言技巧

Linux内核采用的是GCC编译器&#xff0c;GCC编译器除了支持ANSI C&#xff0c;还支持GNU C。在Linux内核中&#xff0c;许多地方都使用了GNU C语言的扩展特性&#xff0c;如typeof、__attribute__、__aligned、__builtin_等&#xff0c;这些都是GNU C语言的特性。 typeof 下面…

如何使用Jellyfin+cpolar低成本部署私人影音平台并实现无公网IP远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

AI大模型之ChatGPT科普(深度好文)

目录 训练ChatGPT分几步&#xff1f; 如何炼成ChatGPT&#xff1f; 如何微调ChatGPT? 如何强化ChatGPT? 如何调教ChatGPT? AI思维链是什么&#xff1f; GPT背后的黑科技Transformer是什么&#xff1f; Transformer在计算机视觉上CV最佳作品&#xff1f; 数字时代&am…