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

news2024/11/28 12:33:27

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()                             # 清除其所有item
        for 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("请填写名称与截图范围")
            return
        data = {'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):            # tu1
                t1 = 1
                self.label_19.setText("已截图")
                self.label_5.setStyleSheet(f'''
                background-color: rgb(97, 174, 255);
                image:url(./{tu1});''')      # 设置图,相对路径
                self.label_5.show()
            else:
                t1 = 0
                if '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):            # tu2
                t2 = 1
                self.label_23.setText("已截图")
                self.label_7.setStyleSheet(f'''
                background-color: rgb(97, 174, 255);
                image:url(./{tu2});''')      # 设置图,相对路径
                self.label_7.show()
            else:
                t2 = 0
                if '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)                   # 动态高度图 tu3
            if 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.coloradmin.cn/o/1586978.html

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

相关文章

使用Android Studio制作一个蓝牙软件 ---(一)

一、创建项目(项目名称---BluetoothActivity) 二、创建HomeActivity页面 1.点击一个文件夹 --- 鼠标右击 --- 新建 --- Acyivity --- Empty Views Activity 三、创建styles.xml 点击 values文件夹 --- 鼠标右击 --- 新建 --- Values Resource File sty…

SLA——让你的信息更安全

在单一的静态密码登录验证机制下,非法入侵者若窃听到Windows桌面登录账号的用户名和密码,便可通过合法权限访问内部系统,此时企业信息安全将面临严峻挑战。 企业为了防止账号信息泄露,通常会强制要求员工定期更换登录密码&#x…

机器学习 -- 端到端的机器学习项目

场景 我们将一个端到端的项目(一个从开始到结束包含了所有必要步骤和组件的完整项目)案例,步骤大概有: 1.观察大局。 2.获得数据。 3.从数据探索和可视化中获得洞见。 4.机器学习算法的数据准备。 5.选择和训练模型。 6.微调模型…

集合系列(十九) -List与数组互转操作介绍

一、数组转List 方式一 通过 Arrays.asList(strArray) 方式,将数组转换List,但不能对List增删,只能查改,否则抛异常,例子如下: public static void main(String[] args) {//创建一个字符串数组String[] …

Redis(三) String字符串

文章目录 前言常见命令SETGETMSETMGETINCRINCRBYDECRDECRBYINCRBYFLOATAPPENDGETRANGESETRANGESTRLEN命令小结 前言 Redis 的数据有很多种数据类型,包括字符串类型、列表类型、哈希类型、集合类型、有序集合类型等。这几种数据类型是针对于 value 来说的&#xff0…

【算法练习】30:快速排序学习笔记

一、快速排序的算法思想 原理:快速排序基于分治策略。它的基本思想是选择一个元素作为“基准”,将待排序序列划分为两个子序列,使得左边的子序列中的所有元素都小于基准,右边的子序列中的所有元素都大于基准。这个划分操作被称为分…

大量excel文件私密性较强 需要密码保护 如何给excel文件批量加密

一,前言 在现代办公环境中,Excel文件已成为数据存储和交流的常见工具。然而,随着数据泄露和信息安全问题的日益严重,如何保护Excel文件的安全性成为了我们关注的焦点。批量加密Excel文件成为了一种有效的解决方案,它可…

uniapp的h5项目 用命令起这个项目(vue-cli)

这里其实就相当于给uniapp h5套了一个vue-cli的壳(纯属个人感觉) 首先需要安装vue-cli 脚手架 npm install -g vue/cli然后创建项目(这里需要在hbuilder创建) vue create -p dcloudio/uni-preset-vue uniapp安装成功后它的结构…

大数据深度学习:基于Tensorflow深度学习的神经网络CNN算法垃圾分类识别系统

文章目录 大数据深度学习:基于Tensorflow深度学习的神经网络CNN算法垃圾分类识别系统一、项目概述二、深度学习卷积神经网络(Convolutional Neural Networks,简称CNN)三、部分数据库架构四、系统实现系统模型部分核心代码模型训练…

AJAX 入门到实战 第1天 2024 笔记

1.1-AJAX入门与axios使用 1.2-认识URL 1.3-查询参数 1.4-案例_地区查询 <script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>/*获取地区列表: http://hmajax.itheima.net/api/area查询参数:pname: 省份或直辖市…

ios包上架系列 一、打包机Flutter项目环境配置

打包的时候一定要断开网络&#xff0c;上线包名只能在打包机配置 1、Xcode 需要从其它电脑空投 版本号&#xff1a;14.3.1 升级到Xcode14.3后发现,从这个版本开始,苹果从Xcode中移除了ARC相关的库,会导致fluter项目下的原生工程使用Xcode编译原生代码没 有问题, 但是flutter项…

Linux系统使用Docker部署Dashy导航页服务并实现公网环境访问

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

Sorting Algorithms in Python (排序算法)

本篇文章主要介绍几种经典排序算法&#xff1a;冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、桶排序和基数排序。并给出用python实现的算法代码。 目录 一、冒泡排序 二、快速排序 三、选择排序 四、堆排序 五、插入排序 六、希尔排序 七、归…

Flutter使用小技巧四(持续更新...)

Flutter使用小技巧四(持续更新...) 解决依赖冲突Row、Column主轴对齐方式Future cathError 异常时添加默认返回值如何在Column中嵌入横着滚动的ListViewFlutter 渲染流程3大步骤Offset.zero & size含义MaterialPageRoute中maintainState作用重载运算符Completer的使用Sta…

Elasticsearch部署安装

环境准备 Anolis OS 8 Firewall关闭状态&#xff0c;端口自行处理 Elasticsearch&#xff1a;7.16.1&#xff08;该版本需要jdk11&#xff09; JDK&#xff1a;11.0.19 JDK # 解压 tar -zxvf jdk-11.0.19_linux-x64_bin.tar.gz# 编辑/etc/profile vim /etc/profile# 加入如下…

国内如何使用Suno-v3 AI音乐生成大模型?附SparkAi创作系统搭建部署教程

一、文章前言 SparkAi创作系统是基于ChatGPT进行开发的Ai问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

Python+Django+Html网页版人脸识别考勤打卡系统

程序示例精选 PythonDjangoHtml人脸识别考勤打卡系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoHtml网页版人脸识别考勤打卡系统》编写代码&#xff0c;代码整洁&#xf…

实用工具系列-ADB使用方式

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;WPS二次开发QQ群:250325397&#xff09;&#xff0c;摸鱼吹牛嗨起来&#xff0…

安装 windows 版 dash —— zeal

1、下载安装 下载地址&#xff1a;Download Zeal 选择 Protable 版 直接使用 zeal 下载文档比较慢甚至失败&#xff0c;可以设置代理&#xff0c;也可以使用下面两种方式。 2、手动下载 docset 文档后导入 这种方法不能够选择文档的版本 &#xff08;1&#xff09;在 http://…

前端和后端解决跨域问题的方法

目前很多java web开发都是采用前后端分离框架进行开发&#xff0c;相比于单体项目容易产生跨域问题。 一、跨域问题CORS 1.什么是跨域问题&#xff1f; 后端接收到请求并返回结果了&#xff0c;浏览器把这个响应拦截了。 2.跨域问题是怎么产生的&#xff1f; 浏览器基于同源…