文字识别技术升级:Airtest与PaddleOCR模型的协作小技巧

一、前言

在进行自动化测试的过程中,ocr文字识别一直是大家最想要实现以及最需要的能力,今天就来介绍一个由百度飞浆提供的一个免费的ocr识别库——PaddleOCR,以及探讨一下,PaddleOCRAirtest协作能擦出怎么样的火花~

二、PaddleOCR介绍

PaddleOCR是百度飞浆AI研发的一个ocr工具库,目前支持多种目标识别,更多的介绍可以戳官方项目去看看:https://github.com/PaddlePaddle/PaddleOCR,我们今天来讲讲,在与Airtest协作中,我们可能会用到PaddleOCR的什么功能。

在使用PaddleOCR之前,需要在自己的本地环境中安装对应的PaddleOCR库,方便我们后续调用。我们建议是安装到本地的python环境内,后续将AirtestIDE的python环境更换为本地python环境即可。

#安装PaddlePaddle
pip install paddlepaddle#安装PaddleOCR whl包
pip install paddleocr

在开始使用之前,我们来了解一下PaddleOCR识别的效果以及返回的情况,PaddleOCR主要是通过我们传入需要识别的图片,通过调用PaddleOCR模型库,去进行识别并返回识别结果或识别后的图片,例如下图这样:

在这里插入图片描述

通过PaddleOCR识别打印文字信息如下,分别以列表的形式返回了所识别到的文字的左上角坐标、右上角坐标、右下角坐标、左下角坐标、识别到的文字以及识别置信度:

[[[154.0, 9.0], [492.0, 9.0], [492.0, 33.0], [154.0, 33.0]], ('小学数学第八册第三单元测试题', 0.9987085461616516)]
[[[238.0, 47.0], [319.0, 47.0], [319.0, 66.0], [238.0, 66.0]], ('(小数乘法)', 0.9819607138633728)]
[[[109.0, 80.0], [160.0, 80.0], [160.0, 103.0], [109.0, 103.0]], ('姓名:', 0.9986250996589661)]
[[[305.0, 81.0], [358.0, 81.0], [358.0, 104.0], [305.0, 104.0]], ('班别:', 0.9987398982048035)]
.............

接下来,我们来看一下如何使用PaddleOCR库来识别图像中的文字,并与Airtest进行联动,实现基于ocr的文字识别点击功能。

首先,我们需要导入PaddleOCR库,并准备好要识别的图片文件。通过调用PaddleOCR的接口,我们可以将图片路径作为参数传入。在识别过程中,PaddleOCR会在result变量中返回识别结果,其中包括文本框的坐标和对应的文字内容。

from paddleocr import PaddleOCR, draw_ocr# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")  # need to run only once to download and load model into memory
img_path = './imgs/11.jpg'
#开始ocr识别图片文字信息
result = ocr.ocr(img_path, cls=True)

通过PaddleOCR获取的图像中的文字信息,我们可以利用Airtest提供的接口和语句,创建一个名为ocr_touch()的函数。这个函数将执行以下步骤:

  1. 使用Airtest进行屏幕截图。
  2. 将截图传递给PaddleOCR进行文字识别。
  3. PaddleOCR获取识别到的文字及其在图像中的位置坐标。
  4. 利用Airtest根据坐标信息点击文字的中心点。

通过这种方式,ocr_touch()函数将实现从识别到点击的自动化操作,简化了整个流程。具体参考代码如下

def ocr_touch(target_text) :# 截屏pic_path=r"./now.png"snapshot(pic_path)# 使用PaddleOCR识别文字ocr_result = ocr.ocr(pic_path, cls=True)# 遍历识别结果,找到目标文字的坐标target_coords = Nonefor line in ocr_result:for word_info in line:#获取识别结果的文字信息textinfo = word_info[1][0]print(textinfo)if target_text in textinfo:# 获取文字的坐标(中心点)x1, y1 = word_info[0][0]x2, y2 = word_info[0][2]target_coords = ((x1 + x2) / 2, (y1 + y2) / 2)breakif target_coords:break# 点击坐标if target_coords:touch(target_coords)else:print(f"未找到目标文字:{target_text}")

三、PaddleOCR与Airtest协作案例

那么我们一起来通过一个小案例来看一下,在日常测试中的表现情况吧~

在这里插入图片描述

参考代码:

# -*- encoding=utf8 -*-
__author__ = "Airtest"from airtest.core.api import *auto_setup(__file__)from paddleocr import PaddleOCRdef ocr_touch(target_text) :# 截屏当前画面pic_path=r"./now.png"snapshot(pic_path)# 使用PaddleOCR识别图片文字ocr_result = ocr.ocr(pic_path, cls=True)# 遍历识别结果,找到目标文字的坐标target_coords = Nonefor line in ocr_result:for word_info in line:#获取识别结果的文字信息textinfo = word_info[1][0]print(textinfo)if target_text in textinfo:# 获取文字的坐标(中心点)x1, y1 = word_info[0][0]x2, y2 = word_info[0][2]target_coords = ((x1 + x2) / 2, (y1 + y2) / 2)breakif target_coords:break# 使用Airtest点击坐标if target_coords:touch(target_coords)else:print(f"未找到目标文字:{target_text}")if __name__ == "__main__":# 初始化PaddleOCRocr = PaddleOCR(use_angle_cls=True, lang='ch')  # 可以根据需要选择语言#打开微博start_app("com.sina.weibo")wait(Template(r"tpl1719891218354.png", record_pos=(0.021, 0.998), resolution=(1080, 2520)))# 传入并点击“发现”ocr_touch("发现")wait(Template(r"tpl1719891346582.png", record_pos=(0.008, -0.957), resolution=(1080, 2520)))# 传入并点击“更多热搜”ocr_touch("更多热搜")wait(Template(r"tpl1719891584526.png", record_pos=(-0.291, -0.606), resolution=(1080, 2520)))# 传入并点击“热搜”ocr_touch("热搜")

四、Airtest_ocr的表现情况

Airtest私有云内,我们也有对应的一款商业化的Airtest-ocr的文字识别库,这个库已经封装好对应的ocr的识别以及对应的操作执行能力,具体介绍可以看往期推文,我们是封装好了日常使用较多的操作,在购买我们的商业化版本后,可以直接调用的~

# 点击某文字
ocr_touch("开始")
# 与 ocr_click("开始") 等价# 双击某文字
ocr_double_click("开始")# 某些情况下,文字处于按钮附近(比如按钮下方),使用offset设置点击偏移量
ocr_touch("开始", offset=(0, -20))
# 以“开始”文字的中心为起点, x轴不偏移,y轴向上偏移20个像素点
ocr_double_click("开始", offset=(0, -20))# 指定高优先级区域 (version>=1.0.10)
ocr_touch("开始", location=(100, 100), threshold=0.98)
# 对于置信度高于0.98的多个 “开始”, 优先点击靠近 (100,100) 的# ocr_swipe 与 swipe函数类似
ocr_swipe("生活", "学习")
# 从“生活”滑向“学习”
ocr_swipe("生活", vector=(0, 100))
# 从“生活”向下滑动100个像素
ocr_swipe((780, 1842), (780, 1000))
# 从坐标1滑向坐标2
......

我们Airtest-ocr的图片文字识别情况如下图:

在这里插入图片描述

PaddleOCR相比,我们Airtest-ocr除了可以直接识别传入图片内容外,还可以动态识别所连接的设备画面。具体的动态识别情况如下(在本地python环境中已加入Airtest-ocr库)

在这里插入图片描述

五、小结

我们本期推文介绍了PaddleOCR的文字识别能力,以及如何与Airtest协作,实现在脚本中可以ocr文字识别并点击的操作。当然,我们这里只是简单的封装实现了一个识别文字并点击的操作,还有更多的日常操作可以通过自己的需求去进行封装实现。或者有需要的同学,也可以联系我们,购买我们Airtest私有云,就可以直接调用Airtest-ocr的操作接口~

如果在测试的过程中,遇到了问题,或者有任何想要深入了解的知识点,欢迎在官方交流群(526033840)里告诉我们或者提交issue,也欢迎大家投稿其他不同的使用小技巧。

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

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

相关文章

打包 最新血液净化器制作技术和资料

网盘 https://pan.baidu.com/s/1fm3LF20dCvy4iSMQklHpug?pwd4je2 便携可穿戴可血液净化用器件及其制备方法和应用.pdf 基于贻贝仿生化学的血液净化材料及其制备方法.pdf 膜分离式一体化血液净化系统.pdf 血液净化器固定夹.pdf 血液净化膜及其制备方法和应用.pdf 评估血液净化…

【手机取证】如何使用360加固助手给apk加固

文章关键词:手机取证、电子数据取证、数据恢复 一、前言 APP加固是对APP代码逻辑的一种保护。原理是将应用文件进行某种形式的转换,包括不限于隐藏,混淆,加密等操作,进一步保护软件的利益不受损坏,下面给…

生成式人工智能如何改变软件开发:助手还是取代者?

生成式人工智能如何改变软件开发:助手还是取代者? 生成式人工智能(AIGC)正在引领软件开发领域的技术变革。从代码生成、错误检测到自动化测试,AI工具在提高开发效率的同时,也引发了对开发者职业前景的讨论…

Java面试八股之MySQL的pconenct和connect有什么区别

MySQL的pconenct和connect有什么区别 在PHP中,mysql_pconnect() 和 mysql_connect() 是用来建立与MySQL数据库服务器连接的两个函数,它们的主要区别在于连接的持久性。 mysql_connect(): 这个函数每次调用都会尝试创建一个新的数据库连接。 当PHP脚本…

天猫超市卡怎么用

猫超卡是在天猫超市里面消费用的卡 但是我们现在买东西都喜欢货比三家,肯定是哪家划算在哪买,要是淘宝其他店铺或京东卖的更便宜,猫超卡自然就用不上了 这种情况的话,还不如直接把猫超卡的余额提出来,买东西也不受限…

【网络安全】漏洞挖掘之Spring Cloud注入漏洞

漏洞描述 Spring框架为现代基于java的企业应用程序(在任何类型的部署平台上)提供了一个全面的编程和配置模型。 Spring Cloud 中的 serveless框架 Spring Cloud Function 中的 RoutingFunction 类的 apply 方法将请求头中的“spring.cloud.function.routing-expression”参数…

【Python学习笔记】菜鸟教程Scrapy案例 + B站amazon案例视频

背景前摇(省流可以跳过这部分) 实习的时候厚脸皮请教了一位办公室负责做爬虫这块的老师,给我推荐了Scrapy框架。 我之前学过一些爬虫基础,但是用的是比较常见的BeautifulSoup和Request,于是得到Scrapy这个关键词后&am…

数据结构-循环链表和双向链表

目录 前言一、循环链表1.1 循环链表的介绍1.2 循环链表的实现 二、双向链表2.1 双向链表的介绍2.2 双向链表的实现 三、循环双链表总结 前言 本篇文章介绍数据结构中的循环链表和双向链表 一、循环链表 1.1 循环链表的介绍 将单链表的形式稍作改变,单链表的最后…

c++习题05-斐波那契数列

目录 一,问题 二,思路 三,代码 一,问题 二,思路 根据题目,可以自己列出斐波那契数列(前四个)如下: 通过列出来的值,可以发现,前两个都是1&…

设置和取消Excel“打开密码”的3种方法

在日常工作中,Excel文件中常常包含敏感数据。为了防止未经授权的访问,给Excel文件设置打开密码是一个非常有效的方法。下面分享3种设置Excel打开密码的方法,以及如何取消这些密码。 先来看看设置Excel打开密码的3种方法。 方法一&#xff1…

hnust 1815: 算法10-6~10-8:快速排序

hnust 1815: 算法10-6~10-8:快速排序 题目描述 快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序的记录分割成两个独立的部分,其中一部分记录的关键字均比另一部分的关键字小,在分成两个部分之后则可以分别…

【人工智能】--强化学习(2.0)

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉强化学习与有监督学习的区别 🍈数据特点 🍈学习目标 🍈反馈机制 🍈策略…

打赢网络免疫升级战!看聚铭铭察高级威胁检测系统如何重塑网络安全防线

在信息洪流的今天,企业如航行于暗礁密布的数字海洋,面对的不仅仅是已知的病毒与漏洞,更有高级威胁这股暗流,悄无声息地侵蚀着网络的肌理。常规的安全措施,犹如常规体检,虽能捕捉表面的异常,却难…

【论文速读】|FuzzAug:探索模糊测试作为神经网络测试生成的数据增强

本次分享论文:FuzzAug: Exploring Fuzzing as Data Augmentation for Neural Test Generation 基本信息 原文作者:Yifeng He, Jicheng Wang, Yuyang Rong, Hao Chen 作者单位:University of California, Davis 关键词:软件测试…

使用随机生成的随机数过程中,保存数据到数组中 出现很多null

如果 randomId 是一个较大的数字,那么会在 temp 数组中留下很多空位。可能会导致很多 null 值。将 temp 从数组改为对象,以避免稀疏数组的问题。 稀疏数组:当一个数组中大部分元素为0,或者为同一值(也就是说可以不是0…

【鸿蒙学习笔记】Image迭代完备

Image Image($r(app.media.zhibo)).width(96) // 图片宽度.height(96) // 图片高度.borderRadius(12) // 图片圆曲度.objectFit(ImageFit.Fill) // 不明objectFit Column({ space: 20 }) {Row() {Image($r(app.media.startIcon)).width(66).height(66).borderRadius(12)}.bac…

结合现货黄金mt4平台 谈谈止损的使用

现在我们做现货黄金交易都可以通过MT4平台来实现从入场到出场的全程操作。所以利用这种网上交易平台,我们能更加好地做止损,下面我们就来讨论一下基于现货黄金MT4平台的止损技巧。 要在现货黄金MT4平台中做好止损,首先我们要确定风险的口子是…

160行代码实现代码雨效果

效果 序言 很喜欢黑客帝国里面那种代码雨的效果,为了锻炼自己的特效编写能力就尝试了一下,花了一下午写出来了。有需要的小伙伴拿去参考. 代码 package com.zgh.myapplication;import android.content.Context; import android.graphics.Canvas; impo…

File类常用构造方法及方法详解

File类是对文件或者目录的一系列操作。如文件和目录的创建、检查、删除、路径获取等。现介绍下常用构造方法和方法。 一、构造方法。 File类提供了多个构造方法来创建File对象,以表示文件或目录。 1. File(String pathname) 通过指定文件路径名创建File对象。 参…

Linux命令大全(面试必备)

前两节有说Git命令,反馈还不错,看来大家对这些必备的命令还挺感兴趣哈,这节就罗列一些Linux必须掌握的命令。 干货满满哦,直接发车... 一、常用的基本命令 1、关机开机 关机 shutdown-h now 立刻关机shutdown-h 3 3分钟后…