1、计划
压测完成后需要编写性能测试报告,报告中所需数据截图较多,使用自动化操作方便快捷,就编写一个界面工具以便后续复用。
基于PyAutoGUI图片定位的自动化截图工具–jmeter部分
基于PyAutoGUI图片定位的自动化截图工具–jmeter部分(2)
上次把jm部分的识别测试写完了,开始截图功能就大致修改一下循环逻辑就能用。lr部分大部分功能与jm流程一致,针对修改挺快的。
2、jm开始截图
对【开始截图】按钮增加信号槽函数jm_start()。
- 函数首先校验是否选中监听器与报告,然后校验选中监听器是否有识别图,最后校验【JMeter】的窗口是否打开,并切换窗口。
- 在指定位置新建"Report diagram"文件夹,存放截图。
- 开始遍历报告,然后遍历监听器截图。
def jm_start(self):"""开始截图"""jtq = [item.text(0) for item in self.mkliebiao_2.selectedItems()] # 选中项目校验bg = [item.text(0) for item in self.mkliebiao_1.selectedItems()]if not jtq or not bg:self.ts.xinxi("请选择监听器与报告")returnwith open(JM_JSON, 'r', encoding='utf-8') as f:data = json.load(f)init_tu1 = data.get('init', {}).get('tu1', {}) # 初始化,识别图校验if init_tu1 == {}:self.daochulog.append(f"未获取到【初始化】:识别图")returnfor key in jtq: # 监听器,识别图校验for i in range(1, 4):tus = data[key].get(f'tu{i}', {})if i != 3 and tus == {}:self.daochulog.append(f"未获取到【{key}】识别图{i}")returnif activate_window("Apache JMeter"): # jmeter启动判断time.sleep(1)else:self.ts.xinxi("没找到名称包含【JMeter】的窗口,请检查jmeter是否启动")returnself.daochulog.append(f"开始截图:\n")if self.report.text(): # 截图保存文件夹path = self.report.text()else:path = QStandardPaths.writableLocation(QStandardPaths.StandardLocation.DownloadLocation)full_path = os.path.join(path, "Report diagram")os.makedirs(full_path, exist_ok=True) # 新建文件夹pg.click(100, 600)pg.press('home') # 切换顶部,避免按钮选中count_bg = 0 # 计数count_image = 0try:for b in bg:self.daochulog.append(f"{b}:开始")for key in jtq:tu1 = data[key].get(f'tu1', {}) # 获取识别图tu2 = data[key].get(f'tu2', {})tu3 = data[key].get(f'tu3', {})lisener = data[key].get(f'lisener', (0, 0, 1, 1))self.locate(tu1) # 点击监听器按钮self.locate(init_tu1) # 清空监听器数据self.locate(tu2) # 点击文件输入框pg.hotkey('ctrl', 'a')pg.press('delete')pyperclip.copy(self.file_names[b]) # 将路径复制到剪贴板pg.hotkey('ctrl', 'v') # 粘贴路径 绕过无法输入中文路径的问题pg.press('enter')time.sleep(1)pg.hotkey('ctrl', 'a') # 清空路径,避免后续无法识别pg.press('delete')if tu3 != {}: # 计算动态高度x, y = self.locate(tu3)lisener[3] = int(y - lisener[1] + 20)pg.screenshot(f"{full_path}\\{b}-{key}.png", region=lisener) # 报告截图count_image += 1count_bg += 1except pg.FailSafeException:self.daochulog.append("\nPyAutoGUI失效保护触发。已停止自动化操作。")except Exception as e:self.daochulog.append(f"出错了:{e}")finally:self.daochulog.append(f"\n截图文件保存路径:{full_path}")self.daochulog.append(f"已选:报告【{len(bg)}】 X 监听器【{len(jtq)}】 = 预计截图【{len(bg)*len(jtq)}】张")self.daochulog.append(f"已截:报告【{count_bg}】个 图片共【{count_image}】张")activate_window("Report screenshot", max=1)
在点击函数locate中,返回了异常pg.FailSafeException,方便外部循环触发:PyAutoGUI失效保护,停止自动化操作。触发方法是鼠标移动到屏幕左上角。
3、截图实现情况
之前已经添加了监听器截图范围与识别图,现在选择报告文件夹,然后选中报告,点击开始。
选择的两个报告与监听器完成截图,一共6张图片。
4、loadrunner界面部分
-
界面与jmeter部分差不多,去掉了初始化按钮,所有的识别图需要在每个Graph信息页面截取。
-
Graph信息编辑页面,增加了报告按钮的增加流程识别图。可以添加默认报告没有的Graph。
5、工具完成界面
工具到现在就完成了,实现了loadrunner与jmeter压测报告的自动化截图,方便后续编写报告图片数据的收集与展示。
代码放这里Gitee