当前位置: 首页 > news >正文

playwright+python UI自动化测试中实现图片颜色和像素对比

def compare_image(expect_path, actual_path, output_path, color_diff_threshold=10.0,max_diff_pixels=100):# 读取图片img1 = cv2.imread(expect_path)img2 = cv2.imread(actual_path)if img1.shape != img2.shape:img2 = cv2.resize(img2, (img1.shape[1], img1.shape))# ---------------------- 颜色差异对比(LAB空间) ----------------------# 转换为LAB颜色空间(更贴近人类视觉)img1_lab = cv2.cvtColor(img1, cv2.COLOR_BGR2LAB)img2_lab = cv2.cvtColor(img2, cv2.COLOR_BGR2LAB)# 计算色差(欧氏距离)color_diff = np.sqrt(np.sum((img1_lab - img2_lab) ** 2, axis=2))mean_color_diff = np.mean(color_diff)if mean_color_diff > color_diff_threshold:# 增强色差可视化(将差异值映射到0-255)color_diff_vis = (color_diff * 255 / np.max(color_diff)).astype(np.uint8)cv2.imwrite(output_path, color_diff_vis)raise ValueError(f"颜色差异过大:{mean_color_diff:.2f} > {color_diff_threshold}")# ---------------------- 像素差异对比(灰度空间) ----------------------# 灰度化 + 模糊处理gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)blur1 = cv2.GaussianBlur(gray1, (5, 5), 0)blur2 = cv2.GaussianBlur(gray2, (5, 5), 0)# 计算像素差异diff = cv2.absdiff(blur1, blur2)_, thresh = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)# 统计显著差异像素数diff_pixels = np.sum(thresh == 255)if diff_pixels > max_diff_pixels:# 标记差异区域(红框)contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)result = img2.copy()for cnt in contours:# if cv2.contourArea(cnt) > min_contour_area:x, y, w, h = cv2.boundingRect(cnt)cv2.rectangle(result, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imwrite(output_path, result)raise ValueError(f"差异像素数超过阈值:{diff_pixels} > {max_diff_pixels}")

1、准备好基线图(expect_path)

2、playwright打开页面,截取元素图片(actual_path)

3、直接将基线图和实际元素图片传入对比方法对比,当差异超过预期,则会在实际元素图片上红框标记出差异部分保存到output_path

需要注意的是:

如果是表单截图,则需要等待所有的字段都加载完

如果是图片预览截图,则需要等待图片彻底打开到最大

http://www.dtcms.com/a/363815.html

相关文章:

  • 便携式显示器怎么选?:6大关键指标全解析
  • 【三班网】初三大事件
  • ELK 统一日志分析系统部署与实践指南(上)
  • 【C++上岸】C++常见面试题目--数据结构篇(第十七期)
  • Oracle 数据库与操作系统兼容性指南
  • LeetCode 31. 下一个排列
  • 机器人抓取中的力学相关概念解释
  • Crawl4AI:为LLM而生的下一代网页爬虫框架
  • 【机器学习入门】5.2 回归的起源——从身高遗传到线性模型的百年演变
  • 学习笔记 | 如何将MaxKB应用对外发布为MCP服务?
  • 嵌入式学习 51单片机基础
  • 数控机床相邻轨迹最大过渡速度计算方法介绍
  • 25 万/秒写入 + 70% 硬件节省,TDengine 在首自信工业时序数据平台中的落地
  • 别再误会了!Redis 6.0 的多线程,和你想象的完全不一样
  • 蒙特卡洛采样与粒子滤波算法学习
  • DP-观察者模式代码详解
  • 代码随想录笔记-回溯算法
  • AI 写作实战:用 GPT-4o+ Claude 3 生成小红书文案,转化率提升 30%
  • 一文看懂 FastDatasets:用 LLM 极速生成高质量 SFT 数据集(已支持 Hugging Face Spaces PyPI)
  • maven私有仓库配置
  • 犀牛派A1上使用Faster Whisper完成音频转文字
  • 【Medical Image Analysis 1区TOP】用于MRI重建的全局感受野傅里叶卷积块
  • 《LINUX系统编程》笔记p8
  • FPGA时序约束(四)--主时钟约束
  • ESLint 相关
  • 算法模板(Java版)_前缀和与差分
  • 2025大学生必考互联网行业证书排名​
  • Git 代码提交管理指南
  • 【鸿蒙面试题-6】LazyForEach 懒加载
  • 单多行文本溢出