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

1、计划

  压测完成后需要编写性能测试报告,报告中所需数据截图较多,使用自动化操作方便快捷,就编写一个界面工具以便后续复用。
基于PyAutoGUI图片定位的自动化截图工具–jmeter部分
  使用pyautogui 库操作鼠标键盘,按钮根据截取的识别图定位。要使用库自己的截图screenshot函数,其它方式如微信截图,pygetwindow 库识别不到图片位置。

import pyautogui as pg      # 图形用户界面 (GUI) 操作,控制鼠标、键盘和屏幕
pg.screenshot(path, region=region)      # 坐标+宽+高    # 截图

2、jm初始化页面

  1. 界面开发
    初始化页面,主要是对公共按钮的识别图进行截取。比如jmeter的全部清理按钮,在每次截图后要清理报告数据,不然再次打开报告数据会附加到已有报告。
    在这里插入图片描述
  2. 窗口切换
    截取识别图像与截取报告,都需要切换到jmeter窗口,这里写了全局函数activate_window()。
    使用pygetwindow 库操作Windows窗口,切换到相应的标题窗口,默认最大化窗口。当max != 0时,窗口不最大化。
import pygetwindow as pw    # 获取、管理和操作窗口
def activate_window(window_title, max=0):
    """激活指定标题片段的窗口,切换至前台最大化True"""
    windows = pw.getAllTitles()     # 返回所有窗口的标题列表
    matching_windows = [win for win in windows if window_title.lower() in win.lower()]  # 遍历列表,忽略大小写
    if matching_windows:
        window = pw.getWindowsWithTitle(matching_windows[0])[0]  # 获取 Window 对象
        window.activate()       # 切换到匹配窗口
        window.maximize() if max == 0 else None       # 最大化窗口
        return True
    else:
        return False
  1. 识别图截取
    先判断跳转jmeter窗口,然后获取输入的截图范围,截图。如果成功则将记录写入JM_JSON。最后切换回‘初始化’窗口。
    def init_cut(self):
        """初始化,截取识别图"""
        if activate_window("Apache JMeter"):        # jmeter启动判断
            time.sleep(1)
        else:
            self.ts.xinxi("没找到名称包含【JMeter】的窗口,请检查jmeter是否启动")
            return

        button = self.sender().objectName()  # 获取点击的按钮名称
        region = (self.spinBox_1.value(), self.spinBox_2.value(), self.spinBox_3.value(), self.spinBox_4.value())
        path = f'Identify/init_tu1.png'

        pg.screenshot(path, region=region)      # 坐标+宽+高    # 截图
        if os.path.exists(path):
            data = {f'{button}': path}
            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 'init' not in existing_data:
                    existing_data['init'] = {}
                existing_data['init'].update(data)
                # 写回更新后的数据
                with open(JM_JSON, 'w', encoding='utf-8') as f:
                    json.dump(existing_data, f)

            self.jm_first_show()
            self.ts.xinxi("截图保存成功")
        else:
            # 文件不存在
            self.ts.xinxi("截图保存失败")

        activate_window("初始化", max=1)
  1. 实现情况
    输入范围,点击 截取,切换窗口,截图显示。其它页面的识别图片截取都差不多流程,就不写了。在这里插入图片描述

3、识别测试

  添加了监听器按钮后,不确定识别图片是否可用,增加了识别测试功能。

  1. 点击功能函数:传入识别图地址,返回坐标。重试两次
    locateCenterOnScreen 函数旨在查找指定图像在当前屏幕上的位置,并返回该图像中心点的坐标。
pyautogui.locateCenterOnScreen(image_path, grayscale=False, confidence=None, region=None)
参数说明:
image_path:必填参数,字符串类型。指定待查找的图像文件的路径。确保文件路径正确且图像可以被正确加载。
grayscale(可选):布尔类型。默认为 False。如果设为 True,则在进行图像匹配时,将对屏幕截图和目标图像都转化为灰度模式,这在某些情况下可能会提高匹配的准确性。
confidence(可选):浮点数类型。指定图像匹配的最低置信度阈值。如果提供了该参数,只有当匹配得分超过该阈值时,才认为找到了匹配项。较高的置信度意味着更严格的匹配要求,较低的置信度可能导致更多的假阳性结果。如果不指定,库通常会使用一个内部默认值。
region(可选):元组类型,包含四个整数 (left, top, width, height),表示在屏幕上的一个矩形区域,分别对应左上角坐标 (x, y) 和区域的宽度、高度。仅在这个区域内查找目标图像。若不提供此参数,则在整个屏幕上搜索。

    def locate(self, tu):
        """根据图片地址,识别图片并点击"""
        MAX_RETRIES = 2         # 重试次数
        retries = 0
        while retries < MAX_RETRIES:
            try:
                location = pg.locateCenterOnScreen(tu, confidence=0.9, grayscale=True,
                                                   region=(0, 0, move_distance_x, move_distance_y))
                                                    # 识别图片位置grayscale=True,confidence=0.9
                pg.moveTo(location, duration=0.5)	# 鼠标移动
                pg.click(location)
                return location                 # 成功找到并点击,返回 location
            except pg.ImageNotFoundException:
                retries += 1
                if retries == MAX_RETRIES:
                    self.daochulog.append(f"经过 {retries} 次重试,仍未找到图像 {tu}。")
                    return False            # 最大重试次数,返回 False
                else:
                    self.daochulog.append(f"第 {retries} 次尝试定位图像 {tu} 失败,将在 0.5 秒后重试。")
                    time.sleep(0.5)         # 延迟一段时间后再重试
            except pg.FailSafeException as e:
                raise e                     # 重新抛出异常,使其到外部停止循环。失效保护
            except Exception as e:
                self.daochulog.append(f"定位图像 {tu} 时发生未知异常:{e}")
                return False
  1. 识别图,点击测试
    先判断获取监听器数据,jmeter窗口,然后遍历初始化按钮与监听器的按钮,点击。日志显示窗口。
    def jm_test(self):
        """识别图,点击测试"""
        jtq = [item.text(0) for item in self.mkliebiao_2.selectedItems()]   # 选中监听器
        if not jtq:
            self.ts.xinxi("请选择待测试监听器")
            return

        if activate_window("Apache JMeter"):        # jmeter启动判断
            time.sleep(1)
        else:
            self.ts.xinxi("没找到名称包含【JMeter】的窗口,请检查jmeter是否启动")
            return

        self.daochulog.append("\n识别测试----开始\n")
        pg.click(100, 600)
        pg.press('home')                                    # 切换顶部,避免按钮选中
        with open(JM_JSON, 'r', encoding='utf-8') as f:
            data = json.load(f)
        init = data.get('init', {})  # 获取tu数据
        tu1 = init.get('tu1', {})
        if tu1:
            self.daochulog.append(f"初始化:----开始")
            try:
                self.locate(tu1)
            except pg.FailSafeException:
                self.daochulog.append("\nPyAutoGUI失效保护触发。已停止自动化操作。")
        else:
            self.daochulog.append(f"初始化:识别图1----未截取\n")

        for key in jtq:                                  # 监听器,识别图校验
            self.daochulog.append(f"{key}----开始")
            for i in range(1, 4):
                tus = data[key].get(f'tu{i}', {})
                if i != 3 and tus == {}:
                    self.daochulog.append(f"识别图{i}----未截取")
                elif tus != {}:
                    try:
                        self.locate(tus)
                    except pg.FailSafeException:
                        self.daochulog.append("\nPyAutoGUI失效保护触发。已停止自动化操作。")

        activate_window("Report screenshot", max=1)
  1. 识别测试情况
    对勾选监听器进行点击,无识别图的进行提示。在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汇舟问卷:做调查问卷需要准备什么?

大家好&#xff0c;我是汇舟问卷。海外问卷调查分为很多个种类&#xff0c;接触最多的有站点查、口子查和渠道查&#xff0c;每种调查的方式都是不一样的。 几年前口子查的操作门槛还是很低的&#xff0c;我们只需要在国外的社交网站上搜索调查问卷、调查这些类似的文字就能获…

MongoDB爬虫:(某扑)实战

https://bbs.hupu.com/bxj网页地址: https://bbs.hupu.com/bxj 然后我们在网页上定义帖子名称、帖子链接、创建时间、回复数、最后回复用户...... 除此之外,我们发现虎扑步行街最多显示的页数(20): 、 当我们打开第3页的时候,网页的URL的地址变为了:https://bbs.hupu.…

基于java+springboot+vue实现的西安旅游系统(文末源码+Lw)23-265

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统西安旅游系统信息管理难度大&#xff0c;容错率低&#…

一文看尽西周275年12王历史

周朝是中国历史上继商朝之后的第三个王朝。周王朝一共传国君 32 代 37 王&#xff0c;享国共计 790 年。周朝分为“西周”&#xff08;前 1046&#xff0d;前 771 年&#xff09;与“东周”&#xff08;前 770 年&#xff0d;前 256 年&#xff09;两个时期。 西周由周武王姬发…

Bug及异常:unity场景角色移动卡墙壁的问题

场景是一个小的杠铃形状封闭空间&#xff0c;美术没有给包围盒&#xff0c;我自己用blender做了一个&#xff08;属于兴趣爱好&#xff09;&#xff0c;如下&#xff1a; 导入场景中使用meshcollider做成空气墙&#xff0c;发现角色移动到角落继续行走会卡角落处&#x…

TSINGSEE青犀AI智能分析网关V4人员睡岗检测算法介绍及应用

人员睡岗AI算法是一种通过人工智能技术来检测和预警人员是否处于睡眠状态的算法。它主要通过分析人员的行为、姿势和身体特征等信息来判断人员是否已经进入睡眠状态。该算法通过对监控摄像头捕捉的画面进行实时分析&#xff0c;利用卷积神经网络&#xff08;CNN&#xff09;对图…

LongVLM:让大模型解读长视频 SOTA 的方法

LongVLM&#xff1a;让大模型解读长视频 SOTA 的方法 使用LongVLM处理长视频的步骤LongVLM 方法3.1 总体架构3.2 局部特征聚合3.3 全局语义整合 效果4.1 实验设置4.2 主要结果4.3 消融研究4.4 定性结果 论文&#xff1a;https://arxiv.org/pdf/2404.03384.pdf 代码&#xff1a…

适配器模式类图与代码

某软件系统中&#xff0c;已设计并实现了用于显示地址信息的类Address,现要求提供基于Dutch语言的地址信息显示接口。为了实现该要求并考虑到以后可能还会出现新的语言的接口&#xff0c;决定采用适配器(Adapter)模式实现该要求&#xff0c;得到如图7.9所示的类图。 【Java代码…

硬件学习件Cadence day16 做个笔记,BOM 位号这个参数输出的两种情况。

1. BOM 中位号有3种情况 1. 一种是位号生成时多行&#xff0c;每行是固定的位数。&#xff08;如下图所示&#xff09; 2. 一种是位号生成时只有一行&#xff0c;但是可以使用表格中自动换行功能&#xff0c;给他换行&#xff0c;但是这个位号本质上只有一行&#xff0c;只是因…

可视化后台管理系统-空框架

1.下载element-plus npm install element-plus --save 注意&#xff1a;element-ui不适配vue3&#xff0c;官方已将vue3版本的更新为element-plus 2.main.js配置 // 全局样式 import ./assets/main.cssimport { createApp } from vue import { createPinia } from piniaimpo…

【教学类-52-02】20240412动物数独02(四宫格)黏贴卡片

作品展示 背景需求 制作了动物数独4宫格后&#xff0c;需要再做一些黏贴上去的图片 【教学类-52-01】20240411动物数独&#xff08;4宫格&#xff09;-CSDN博客文章浏览阅读53次。【教学类-52-01】20240411动物数独01&#xff08;4宫格&#xff09;https://blog.csdn.net/rea…

中科方德服务器操作系统安装zabbix5.0

原文链接&#xff1a;中科方德服务器操作系统安装zabbix5.0 Hello&#xff0c;大家好啊&#xff01;接着我们上一次的讨论&#xff0c;今天我要为大家介绍如何在已经安装好的中科方德服务器操作系统基础上&#xff0c;安装和配置Zabbix 5.0。Zabbix是一个开源的监控软件工具&am…

C语言 | Leetcode C语言题解之第24题两两交换链表中的节点

题目&#xff1a; 题解&#xff1a; struct ListNode* swapPairs(struct ListNode* head) {struct ListNode dummyHead;dummyHead.next head;struct ListNode* temp &dummyHead;while (temp->next ! NULL && temp->next->next ! NULL) {struct ListNod…

[Python图像识别] 五十二.水书图像识别 (2)基于机器学习的濒危水书古文字识别研究

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。目前我进入第二阶段Python图像识别,该部分主要以目标检测、图像…

go语言学习--3.常用语句

目录 1.条件语句 1.1 if语句 1.2 if-else语句 1.3 switch语句 1.4 select语句 2.循环语句 2.1循环处理语句 2.2循环控制语句 3.go语言关键字 1.条件语句 和c语言类似&#xff0c;相关的条件语句如下表所示&#xff1a; 1.1 if语句 if 布尔表达式 {/* 在布尔表达式为 t…

前端常见面试题-CSS盒模型

前言&#xff1a; 什么是CSS盒模型&#xff1f;盒模型的构造&#xff1f; 在前端开发中&#xff0c;CSS 盒模型是一种非常基础且核心的概念&#xff0c;它描述了文档中的每个元素被框架处理的方式。 ---- 打开浏览器开发者工具&#xff0c;查看Elements右侧下的Styles底部。 …

C++ | Leetcode C++题解之第21题合并两个有序链表

题解&#xff1a; 题解&#xff1a; class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {ListNode* preHead new ListNode(-1);ListNode* prev preHead;while (l1 ! nullptr && l2 ! nullptr) {if (l1->val < l2->val) {prev-…

Python用于模拟量子系统库之qutip使用详解

概要 QuTiP(Quantum Toolbox in Python)是一个用于模拟量子系统的开源Python库,它提供了丰富的工具来研究量子力学和量子信息学。 安装 通过pip可以轻松安装QuTiP: pip install qutip特性 多种量子对象表示:支持量子态、算符和超算符的表示和操作。 动力学模拟:提供了…

LeetCode 98 验证二叉搜索树

题目描述 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜…

VM虚拟机Linux系统Redhat7.4版本进行网络配置

日常中自己搭建的虚拟机一般用到两种网络方式&#xff0c;第一种是仅主机模式、还有一种是NAT模式。 1、仅主机模式&#xff1a;可以和自己本地电脑&#xff0c;或者虚拟机和虚拟机之间进行网络通信&#xff0c;相当于一个局域网&#xff0c;是不能连接外网的。 2、NAT模式&a…