图像字符识别(OCR)

光学字符识别(OCR)是一项强大的技术,它可以将图像中的文字内容提取为可编辑的文本。在自动化测试和应用程序开发中,OCR技术可以帮助识别并验证图像或控件中的文字内容,即使这些控件并不直接支持文字提取功能。通过使用OCR库,你可以对内存中的图片、文件中的图片,甚至是从应用程序控件截图中提取文字,实现更广泛的自动化测试和数据处理。

控件上的OCR方法

visualText方法

下列的控件支持visualText方法:

  1. 虚拟控件,包括虚拟化的普通控件
  2. Image控件

visualText方法的函数方法如下:

JavaScript
Python
visualText(): Promise<string>;
def visualText(self, options: Optional[OcrOptions]=None) -> "str":

详细说明,请参见visualText方法

clickVisualText方法

clickVisualText方法只适用于虚拟控件。此方法使用OCR在虚拟控件快照中查找指定的文本,然后点击对应的文本位置。

JavaScript
Python
clickVisualText(text: string, options?: ClickVisualTextOptions): Promise<void>;
def clickVisualText(self, text: str, options: Optional[ClickVisualTextOptions]=None) -> "None":

有关详细文档,请参见clickVisualText方法

模型管理器中的OCR

在模型管理器中,你可以为包含可视文字的控件部分创建虚拟控件,然后在这些虚拟控件上调用 visualText 方法。你可以在模型管理器中测试 visualText 方法。请注意以下事项:

  • 测试时,确保控件区域未被其他窗口覆盖。
  • 模型管理器加载的OCR识别库与界面语言相关。即英文界面会加载英文语言训练库,中文界面会加载中文库。

如果在方法测试中想去掉识别后文字的空格,可以传递参数 {whitespace: false},如下图所示:

例如,在Windows控件 Menu 上创建 Top One的虚拟控件,然后调用 visualText 方法,如下图所示:

了解更多关于虚拟控件的信息,请参考虚拟控件

OCR库函数

你可以直接使用leanpro.visual下的OCR类,对内存中的图片或图片文件进行识别。以下是OCR库的定义和使用示例:

JavaScript
Python
class Ocr {
    public static getVisualText(imageData: Buffer | string, options?: OcrOptions): Promise<string>;
    public static getVisualTextFromFile(filePath: string, options?: OcrOptions): Promise<string>;
    public static getTextLocations(imageData: Buffer | string): Promise<TextBlock[][]>;
    public static getTextLocation(imageData: Buffer | string, text: string): Promise<Rect>
}
class Ocr:
    def getVisualText(imageData: Union[bytes, str], options: Optional[Dict]) -> str
    def getVisualTextFromFile(filePath: str, options: Optional[Dict]) -> str
    def getTextLocations(imageData: Union[bytes, str]) -> List[List['TextBlock']]
    def getTextLocation(imageData: Union[bytes, str], text: str) -> 'Rect'

方法和使用示例

getVisualText(imageData: Buffer | string, options?: OcrOptions)

对传入的图片进行识别并返回识别出的文字。

参数:

  • imageData (Buffer | string): 图片内容的 Buffer 或 base64 编码的字符串。
  • options (OcrOptions | Optional): 识别选项,可用于指定一些额外的识别参数。

返回值:

  • Promise<string>: 异步返回识别出的文本。

示例:

JavaScript
Python
const { Ocr } = require('leanpro.visual');
(async function () {
    let screenshot = await model.getVirtual("virtual").takeScreenshot();
    let visualText = await Ocr.getVisualText(screenshot);
    console.log(`text is ${visualText}`);
})()
from leanproAuto import Ocr
with open('../support/demo.png', 'rb') as f:
    image_data = f.read()
    visual_text = Ocr.getVisualText(image_data)
    print(visual_text)

getVisualTextFromFile(filePath: string, options?: OcrOptions)

对目标路径的图片进行文字识别并返回识别出的文字。

参数:

  • filePath (string): 本地图片文件的路径。
  • options (OcrOptions | Optional): 识别选项,可用于指定一些额外的识别参数。

返回值:

  • Promise<string>: 异步返回识别出的文本。

示例:

JavaScript
Python
const { Ocr } = require('leanpro.visual');
(async function() {
    let textPic = await Ocr.getVisualTextFromFile('../support/demo.png');
    console.log(`text is ${textPic}`);
})()
from leanproAuto import Ocr
visual_text_from_file = Ocr.getVisualTextFromFile('../support/demo.png')
print(visual_text_from_file)

getTextLocations(imageData: Buffer | string)

对传入的图片进行识别,并返回识别出的文字内容及其所在位置。文字和位置以词为单位,返回包含 TextBlock 结构的二维数组,每个一维数组代表一行文字。

参数:

  • imageData (Buffer | string): 图片内容的 Buffer 或 base64 编码的字符串。

返回值:

  • Promise<TextBlock[][]>: 异步返回表示词块和行位置的二维数组。

其中 TextBlock 的接口定义如下:

JavaScript
interface TextBlock {
    text: string;
    boundingRect: {
        left: number,
        top: number,
        width: number,
        height: number
    }    
}

示例:

JavaScript
Python
let imageData = fs.readFileSync('../support/demo.png');
let blocks = await Ocr.getTextLocations(imageData);
const block1 = blocks[0][0];
const block2 = blocks[1][0];

assert.equal(block1.text, 'HughesBill');
assert.equal(block1.boundingRect.left, 4, "计算图片文字左边值错误");
assert.equal(block1.boundingRect.top, 9, "计算图片上边值错误");

assert.equal(block2.text, 'HoyleTaylor');
assert.equal(block2.boundingRect.left, 4, "计算图片文字左边值错误");
assert.equal(block2.boundingRect.top, 39, "计算图片上边值错误");
from leanproAuto import Ocr

with open('../support/demo.png', 'rb') as f:
    image_data = f.read()

    blocks = Ocr.getTextLocations(image_data)

    block1 = blocks[0][0]
    block2 = blocks[1][0]

    assert block1['text'] == 'HughesBill'
    assert block1['boundingRect']['left'] == 4, "计算图片文字左边值错误"
    assert block1['boundingRect']['top'] == 9, "计算图片上边值错误"

    assert block2['text'] == 'HoyleTaylor'
    assert block2['boundingRect']['left'] == 4, "计算图片文字左边值错误"
    assert block2['boundingRect']['top'] == 39, "计算图片上边值错误"

getTextLocation(imageData: Buffer | string, text: string)

在传入的图片中查找指定文字,并返回该文字在图片中的位置对象(Rect 对象)。

参数:

  • imageData (Buffer | string): 图片内容的 Buffer 或 base64 编码的字符串。
  • text (string): 需要查找的指定文字,必须是原图片中存在且处于同一行的连续文字。

返回值:

  • Promise<Rect>: 异步返回该匹配文字的矩形屏幕范围。如果不存在目标文本,则返回 null

示例:

JavaScript
Python
let imageData = fs.readFileSync(fullpath);
let block = await Ocr.getTextLocation(imageData, 'HoyleTaylor');
let x = block.left;
let y = block.top;
assert.equal(x, 4, "计算图片文字左边值错误");
assert.equal(y, 39, "计算图片上边值错误");
from leanproAuto import Ocr
with open('../support/demo.png', 'rb') as f:
    image_data = f.read()
    block = Ocr.getTextLocation(image_data, 'HoyleTaylor')

x = block['left']
y = block['top']
assert x == 4, "计算图片文字左边值错误"
assert y == 39, "计算图片上边值错误"

其它控件的OCR支持

虽然并非所有控件对象都直接支持OCR文字识别,但你可以通过以下步骤实现对任意控件的文字识别:

  1. 在控件上调用takeScreenshot方法获取快照图片。
  2. 使用Ocr.getVisualText方法识别该图片上的文字。

下面是一个示例代码:

JavaScript
Python
const { Ocr } = require('leanpro.visual');

(async () => {
    // 获取按钮的截图
    let image = await model.getButton("Clear entry").takeScreenshot();
    // 对截图进行OCR识别
    let text = await Ocr.getVisualText(image);
    console.log(text);
})();
from leanproAuto import Ocr

image = model.getButton("Clear entry").takeScreenshot()
text = Ocr.getVisualText(image)
print(text)

在这个例子中,我们从一个按钮控件获取图片,并将图片上的文字识别出来并打印到控制台。通过这种方式,你可以对任何控件的文字内容进行OCR识别,无论该控件是否直接支持OCR。

如何切换OCR引擎

在CukeTest中,您可以选择使用两种不同的OCR引擎:tesseractpaddle。通过切换单选按钮,您可以手动选择使用其中一个OCR引擎来进行文本识别。打开CukeTest界面,在“设置”->“高级”中的“OCR引擎”项目下点击标有tesseractpaddle的单选按钮,再点击“保存”键,即可完成OCR引擎的切换。

OCR 最佳实践与注意事项

OCR(光学字符识别)是一项基于视觉的识别技术。它的识别准确率会受到多种画面因素的影响,如字体颜色、字号、缩放、对比度、抗锯齿、背景噪声、渲染方式以及动态渲染(动画、渐显等效果)。因此,在不同的运行环境或显示比例下,OCR 的识别结果可能会出现波动或误判。

为了提高 OCR 技术在自动化测试中的稳定性和准确率,建议参考以下最佳实践。

识别稳定性提升建议

  1. 放宽匹配条件(增加容错)

    当目标文本可能被 OCR 识别为多个变体时,不必强求完全精确匹配。可采用以下方式提升容错性:

    • 使用字符串包含判断而非全等匹配。
    • 忽略大小写或不必要的空白字符。
    • 使用模糊匹配或正则表达式匹配。
  2. 提高界面文字可读性(调整字号或缩放)

    若界面允许缩放或调整显示比例,建议在识别前将界面放大到合适比例(如 125% 或 150%),确保文字边缘更清晰。 在自动化脚本中,也可以在执行 OCR 识别前临时调整应用或页面的缩放比例,待识别完成后再将其恢复原状。

  3. 结合 Pattern(图案对象)辅助定位

    当文字识别不稳定时,可以寻找附近其他稳定的视觉元素(如 Logo、图标、按钮边框、固定的背景色块等)作为模板匹配的锚点,再结合相对位置进行点击或操作。 Pattern 匹配通常不依赖字体的渲染结果,因此在部分复杂界面中的表现比单独使用 OCR 会更加稳定。

异常排查清单

如果在执行过程中遇到 OCR 识别失败或异常,建议逐项核查以下情况:

  • 字号与缩放:字体是否过小?是否可以放大或调整界面的缩放比例?
  • 对比度与背景:字体与背景的对比度是否充足?背景是否过于复杂或呈现半透明效果?
  • 渲染时机:页面/控件是否仍在动态渲染中?识别前是否已加入必要的等待步骤,确保画面彻底渲染完毕?
  • 替代方案:是否有其他图形元素可依循,从而替代纯文字作为定位或校验的依据?
  • 环境差异:是否因为特定的字体或系统渲染差异导致 OCR 容易出错?(可尝试在另外的系统中验证)
  • 容错处理:脚本中是否对识别结果增加了去空、正则校验等格式化操作或容错处理逻辑?
  • 调试信息:是否在捕获异常时保存了执行失败的屏幕快照,以配合后续的分析与排查?

results matching ""

    No results matching ""