SilkTest天龙八部系列2-OCR

SilkTest提供了基本的OCR功能,其中OCR 代表Optical Character Recognition光学字符识别,它允许SilkTest从屏幕区域或者图片上获取文字内容。注意:这和silktest从对象上取得caption或者text是两回事(通过windows消息调用),OCR是根据像素的分布用一定的pattern来识别文字的。
Silktest的OCR函数定义在安装目录里的OCR.inc中,它主要提供了两个函数:OcrGetTextFromWnd(),OcrGetTextFromBmp().它们分别提供了从屏幕对象上和bmp文件中识别文字的功能。
帮助文件中对他们的描述如下:
OCR.inc includes the following 4Test functions for OCR:
·    function:    iRet = OcrGetTextFromBmp (sOcrText, sBitmapFile)
·    returns:    iRet: Result length. If conversion fails, then an E_OCR exception will be raised. INTEGER.
·    parameter: sOcrText: The result of converting the bitmap to text. NULL if conversion failed. OUT. STRING.
·    parameter: sBitmapFile: The bitmap (.bmp) file to convert. STRING.
·    notes:    Convert a bitmap file into text. The conversion uses the preconfigured pattern file, which is in the textract.ini file (Database Path setting).
·    function:    iRet = OcrGetTextFromWnd (sText, wWindow[, rCapture])
·    returns:    iRet: Result length. If conversion fails, then an E_OCR exception will be raised. INTEGER.
·    parameter: sText: The result of converting a bitmap of the window to text. NULL if conversion failed. OUT. STRING.
·    parameter: wWindow: The window that will be the source of the bitmap to be converted to text. WINDOW.
·    parameter: rCapture: The capture region. OPTIONAL. RECT.
·    notes:    Convert a bitmap of a window (or area within a window) into text. The conversion uses the preconfigured pattern file, which is specified in the textract.ini file (Database Path setting).

SilkTest默认使用的textract来实现文本的识别,它的设置可以在textract.ini配置文件中找到,其中的配置行Database Path=C:/Program Files/Borland/SilkTest/SgOcrPattern.pat定义了使用sgOcrPattern.pat这个pattern库来进行识别工作。
下面我们做一个简单的例子,你需要首先打开一个记事本(notepad),输入1行文本:Here is an example for OCR test

然后运行下面的script:

[-] testcase OCR()
[ ] int iRet  // return value
[ ] string sText // text
[ ] string sBmp = “c:/screenshot.bmp”
[ ] MainWin(“New Text Document (2).txt*|*Notepad|$C:/WINDOWS/system32/NOTEPAD.EXE”).SetActive()
[ ] iRet = OcrGetTextFromWnd (sText, MainWin(“New Text Document (2).txt*|*Notepad|$C:/WINDOWS/system32/NOTEPAD.EXE”).TextField(“#1|$15”))
[ ] print(iRet)
[ ] print(sText)
[ ] MainWin(“SH.txt*|*Notepad|$C:/WINDOWS/system32/NOTEPAD.EXE”).TextField(“#1|$15”).CaptureBitmap(sBmp)
[ ] iRet = OcrGetTextFromBmp (sText, sBmp)
[ ] print(iRet)
[ ] print(sText)

它的目的是从记事本的TextField上用 OcrGetTextFromWnd() 直接识别文本内容,然后再抓屏在c盘上生成一个bmp文件,然后用 OcrGetTextFromBmp() 从该bmp文件识别文本内容。
在我机器上得到的结果是:

[ ] 37
[ ] H  r   is an   xam  I   for OCR t  st
[ ] 37
[ ] H  r   is an   xam  I   for OCR t  st

这说明用 OcrGetTextFromWnd() 和OcrGetTextFromBmp()得到的结果基本一致,但是都不太理想,因为有一些字符都没有识别出来。如果你把记事本中的文本内容改成大写: HERE IS AN EXAMPLE FOR OCR TEST
结果就好得多了。

[ ] 32
[ ] HERE IS AN EXAMP  E FOR OCR TEST
[ ] 32
[ ] HERE IS AN EXAMP  E FOR OCR TEST

可见SilkTest自带的OCR识别库并不能很好的应对各种情况,所以在实际的项目中,你可能需要使用其他第三方或者开发自己的pattern库,这对自动化测试工程师来说是一个挑战。

Leave a comment

请输入正确的验证码