文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python图像识别及操作

2023-09-04 09:57

关注

导语

自动化测试实施过程中,由于Android或web部分控件和区域无法通过uiautomator或hierarchy、selenium等系统提供的方式获取相关区域属性,无法通过控件属性访问指定区域,实现操作和断言自动化动作。因此,集成截图查找功能,通过自动化脚本编写过程中,截取图片部分区域用于预操作或断言设置。在执行过程中,动态的从终端设备中截取当前屏幕截图进行对比,完成操作和断言自动化动作。

环境配置

安装环境

Python3.7+环境
2.OpenCV安装,打开CMD终端,使用pip install opencv-python安装OpenCV
3.Numpy安装,打开CMD终端,使用pip install numpy安装Numpy模块

截图查找功能可完成的自动化动作

点击操作(Click By Image)

在自动化脚本编写过程中,截取指定屏幕截图中的某一区域。在自动化脚本执行过程中,通过匹配该区域截图在当前屏幕截图中的坐标位置,计算区域截图中间点(或区域截图中任一点)的实际坐标值,通过uiautomator或webdriver提供的点击坐标方法进行模拟点击操作。

断言操作(Assert Image)

在自动化测试中,需要对自动化测试结果进行判断,由于部分控件或区域无法通过控件属性进行判断。因此,考虑到对上述点击操作的截图查找方法的扩展,截取指定屏幕截图中的某一区域用于断言。在自动化脚本执行过程中,可以通过匹配该区域截图是否在当前屏幕截图中进行判断,到达通过图片进行断言的功能。

截图查找功能的Demo实现(以Android为例)

截图方法

通过screencap方法进行截图:
1.终端设备操作跳转到指定界面
2.输入adb shell screencap /sdcard/test.png 进行截取当前界面截图
3.输入adb pull /sdcard/test.png . 将截图下载到本地
4.使用图片浏览工具,打开图片,使用微信截图或其他截图工具截取图片中想要点击或断言的部分,保存作为匹配截图。

Demo实现

导入cv2和numpy包
2.#!/bin/env python

# coding:utf-8import cv2import numpy as np

使用cv2读取匹配截图和目标匹配截图
在这里插入图片描述

1.1匹配截图(srcImage)

在这里插入图片描述

1.2 目标匹配截图(desImage)

desImage = cv2.imread(‘destination.png’) # 读入一副彩色图像,图像透明度会被忽略
srcImage = cv2.imread(‘source.png’, 0) # 单通道读取,即灰白图像

图片处理

img_gray = cv2.cvtColor(desImage, cv2.COLOR_BGR2GRAY) # 对目标截图进行色彩空间转换,RGB转换为GRAY
h, w = srcImage.shape[:2] # 读取srcImage 高度和宽度

模版匹配方法

res = cv2.matchTemplate(img_gray, srcImage, cv2.TM_CCOEFF_NORMED) # 对转换后的目标截图和匹配截图进行模版匹配获取匹配度较高的图片位置属性threshold = 0.97 # 匹配度值0.97, 匹配度最大值为1loc = np.where(res >= threshold)  # 筛选出匹配度大于0.97的图片位置属性计算坐标值,并描画到目标匹配截图上for pt in zip(*loc[::-1]):  # *号表示可选参数    right_bottom = (pt[0] + w, pt[1] + h) # 右下角位置坐标    cv2.rectangle(desImage, pt, right_bottom, (0, 0, 255), 1) # 画出矩形位置    print ((pt[0] + w + pt[0]) / 2, (pt[1] + h + pt[1]) / 2) # 打印图片中心点坐标值计算出最后一个匹配结果的图片中心点坐标值,并实现点击操作x, y = ((pt[0] + w + pt[0]) / 2, (pt[1] + h + pt[1]) / 2) # 计算最后一个匹配区域的中心点坐标值import osos.system("adb shell input tap {0} {1}".format(x, y)) # 执行点击操作

展示匹配结果

cv2.imshow("result", desImage) # 展示匹配结果图片 cv2.waitKey(0) # 等待关闭图片窗口cv2.destroyAllWindows() # 销毁所有窗口

在这里插入图片描述
相关Demo源码

封装代码

截图点击方法

# DeviceMassage  设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备# destinationImage   大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png# sourceImage    小图位置+名字,代表被点击按钮,格式 source.png 或 D:\Pytest\Test\venv\source.png# TypeNumber     属性值  1代表截图后对比,2代表直接按照传入的值对比,若选择2则需要预先准备好大图# FileOkPath     成功会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ok/ 或 D:/Pytest/ok/# FileNgPath     失败会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ng/ 或 D:/Pytest/ng/# ScreenOkImage  成功会截图的名称 格式:_ImageClick_OK.png# ScreenNgImage  失败会截图的名称 格式:_ImageClick_NG.png执行成功返回 true 否则返回 false# Test1._ImageClick("emulator-5554", "destination.png", "source2.png", 2, "aa/", "bb/", "_ImageClick_OK.png","_ImageClick_NG.png")

截图滑动方法

# DeviceMassage  设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备# intstartImage  起始 小图位置+名字,代表被滑动起始,格式 source.png 或 D:\Pytest\Test\venv\source.png# intendImage    终止 小图位置+名字,代表被滑动终止,格式 source.png 或 D:\Pytest\Test\venv\source.png# destinationImage   大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png# intduration    代表滑动速度,值必须为整数,例如 100# TypeNumber     属性值  1代表截图后对比,2代表直接按照传入的值对比,若选择2则需要预先准备好大图# FileOkPath     成功会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ok/ 或 D:/Pytest/ok/# FileNgPath     失败会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ng/ 或 D:/Pytest/ng/# ScreenOkImage  成功会截图的名称 格式:_ImageClick_OK.png# ScreenNgImage  失败会截图的名称 格式:_ImageClick_NG.png# 执行成功返回 true 否则返回 false# Test1._ImageSwipe("emulator-5554","source2.png", "sourcew.png", "destination.png", 300, 2,"aa/","bb/","_ImageSwipe_OK.png","_ImageSwipe_NG.png")

截图判断是否存在

# destinationImage   大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png# sourceImageList    小图位置的List 可以为多个,最少为1个,若输入多个,则代表列表内的值均会与大图对比# 若均存在则返回 true 否则返回 false# sourceImageList = [ "sourcew.png"]# print Test1._ImageExists("destination.png", sourceImageList, 2)

截图长按方法

# DeviceMassage  设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备# destinationImage   大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png# sourceImage    小图位置+名字,代表被点击按钮,格式 source.png 或 D:\Pytest\Test\venv\source.png# TypeNumber     属性值  1代表截图后对比,2代表直接按照传入的值对比,若选择2则需要预先准备好大图# FileOkPath     成功会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ok/ 或 D:/Pytest/ok/# FileNgPath     失败会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ng/ 或 D:/Pytest/ng/# ScreenOkImage  成功会截图的名称 格式:_ImageClick_OK.png# ScreenNgImage  失败会截图的名称 格式:_ImageClick_NG.png# 执行成功返回 true 否则返回 false# Test1._ImageLongClick("emulator-5554","destination.png", "source2.png", 2, "aa/", "bb/", "_ImageLongClick_OK.png","_ImageLongClick_NG.png")

截图拖拽方法

# DeviceMassage  设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备# intstartImage  起始 小图位置+名字,代表被滑动起始,格式 source.png 或 D:\Pytest\Test\venv\source.png# intendImage    终止 小图位置+名字,代表被滑动终止,格式 source.png 或 D:\Pytest\Test\venv\source.png# destinationImage   大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png# intduration    代表拖拽速度,值必须为整数,例如 100# TypeNumber     属性值  1代表截图后对比,2代表直接按照传入的值对比,若选择2则需要预先准备好大图# FileOkPath     成功会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ok/ 或 D:/Pytest/ok/# FileNgPath     失败会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ng/ 或 D:/Pytest/ng/# ScreenOkImage  成功会截图的名称 格式:_ImageClick_OK.png# ScreenNgImage  失败会截图的名称 格式:_ImageClick_NG.png# 执行成功返回 true 否则返回 false# Test1._ImageDrag("emulator-5554", "source2.png", "sourcew.png", "destination.png", 300, 2, "aa/", "bb/","_ImageDrag_OK.png", "_ImageDrag_NG.png")

截图方法

# DeviceMassage  设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备# destinationImage 为要截图 保存图片的位置+名称,格式 source.png 或 D:\Pytest\Test\venv\source.png# Test1._screenshot("emulator-5554","destination.png")# 执行成功返回 true 否则返回 false

代码源码
https://download.csdn.net/download/qq_36616956/87426577

参考文献

Python OpenCV入门: https://blog.csdn.net/fu6543210/article/details/80835280
Opencv中颜色控件转换: https://blog.csdn.net/u012193416/article/details/79312798

来源地址:https://blog.csdn.net/qq_36616956/article/details/128929414

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯