如何进行基于图像的测试
本节解释了创建基于图像查找的测试脚本所需的步骤。基于屏幕外观检索对象是如何识别和访问对象中描述的基于属性识别的补充方法。
作为一个示例应用,我们将使用由Filip Höfer开发的象棋2012游戏。该应用程序使用了几种经典控件,如按钮和菜单,如下图所示。通常,建议通过多属性名称(如{type='Button' text='Start new game'}
)来访问这些控件。为了便于本教程,我们将把本短测试案例限制为基于图像的对象搜索。
示例应用程序 - 象棋游戏
我们将自动化一系列简单步骤
- 开始新游戏
- 将白棋从C2格移动到C4格。
OCR设置
默认情况下,Squish支持Tesseract OCR引擎。为了使用Tesseract引擎,您需要安装操作系统上的Squish Tesseract包
操作系统 | 包名 |
---|---|
Microsoft Windows | tesseract-4.0.0-for-squish.exe |
Linux | tesseract-4.0.0-for-squish.x64.run |
OS X | tesseract-4.0.0-for-squish.x64.dmg |
在选择了Squish作为产品后,这些包可以在Qt客户门户的下载部分找到(您可能需要按版本对包列表进行筛选,并将版本选择为特殊,以便于找到Tesseract包)。
Tesseract包安装程序可以将所选的安装路径注册到Squish中。如果安装过程中省略了此步骤,可以在squishide
的OCR首选项或ocr.ini文件中稍后指定OCR引擎的路径。
Squish支持多个OCR引擎,但每个引擎在使用之前都需要进行一些步骤。
OCR.Space和Amazon Rekognition引擎都需要用于标识服务特定用户的身份验证密钥。这些引擎密钥的获取说明可以在此处和此处找到。身份验证数据需要在OCR面板或ocr.ini文件中指定。
开始新游戏
虽然我们通常通过基于属性的表单访问(如mouseClick(waitForObject(":Start_Button"))
)自动化按钮的推送,但现在我们将使用光学字符识别(OCR)来交互该按钮。
- 记录(《img alt="" src="images/record.png"> )测试用例。
- 调用插入 > mouseClick(<OCR>) ( )操作。
- 等待
squishide
捕获屏幕内容,并使用点击-拖动绘制一个选择按钮上“开始新游戏”文字的范围。 - 确保搜索文本字段包含“开始新游戏”文字。
- 按下插入鼠标点击按钮。这将执行以下操作:a) 在按钮上执行点击操作;b) 将脚本语句
mouseClick(waitForOcrText("Start new game"))
排队插入记录的末尾。
开始新游戏
移动兵
棋子不是Squish能识别的控件,因此我们被迫使用它们的像素表示。从棋盘切出第一张图片将是C2格上的白兵
white_pawn.png
- 调用插入 > mouseClick(<Image>) ( )操作。
- 等待
squishide
捕获屏幕内容并将红色选择矩形移动到 C2 格的棋子周围。 - 输入一个有意义的文件名,例如
white_pawn
。 - 按下 Insert mouseClick 按钮。这将:a) 在棋子上执行点击操作,b) 将脚本语句
mouseClick(waitForImage("white_pawn"))
队列并插入记录的末尾。
目前棋盘上仍有八个这样的棋子,其中四个位于我们已捕获的相同白色背景上。在选择确认后,Squish 将搜索桌面截图,找到所有与选择匹配的位置并计算出现索引。该索引将作为 ScreenRectangle waitForImage(imageFile, [parameterMap], [searchRegion]) 调用的一个部分被记录下来。因此,选择感兴趣的特定图像非常重要,即使屏幕上存在其他相同的出现 occurrences。
白棋图像选择
点击 C4 格将执行移动。一旦我们激活 Insert > mouseClick(<Image>) action ( ),我们就可以选择之前记录的图像。
图像重用或创建
目前无法重用棋子的图像。我们将使用 New Image 按钮通过上面相同的方法记录一个填充 C4 格空的图像。
不推荐记录仅由平面背景组成的搜索图像。为了避免这种情况,所选图像应包括相邻方格的边缘。
white_square.png
如前所述,其他空的白色方格也将被考虑,包括记录为 ScreenRectangle waitForImage(imageFile, [parameterMap], [searchRegion]) 函数的 occurrence
参数的出现索引。
下一个记录的移动是将棋子从 E2 移至 E4。我们激活 Insert > mouseClick(<Image>) ( ),并选择先前创建的 white_pawn 文件。由于棋盘上仍有多个棋子可见,Squish 将打开 Image Search Preview dialog 并显示带有红色边框的多个匹配项。
选择图像出现次数
这次记录在测试脚本中的出现索引将基于所选图像。
可以使用相同的步骤重复上述步骤,使用 chess_square.png 文件点击 E4 格。
已记录的脚本
在基于图像的动作插入完成后,我们在控制栏中按下停止记录动作 ( )。生成的脚本将看起来像这样(或您选择的语言中的等效的东西)
function main() { startApplication("chess2012"); mouseClick(waitForOcrText("Start new game")); mouseClick(waitForImage("white_pawn", { occurrence: 2 })); mouseClick(waitForImage("chess_square", { occurrence: 7 })); mouseClick(waitForImage("white_pawn", { occurrence: 3 })); mouseClick(waitForImage("chess_square", { occurrence: 4 })); }
此时,我们已经自动化了一个测试,而不需要访问象棋应用程序的内部结构。这种低障碍的缺点是依赖于应用程序的特定视觉外观。
容错图像搜索
在应用程序外观发生微小变化的情况下,Squish 可以引入容错,以找到与之前捕捉的影像匹配的对象。
所用的 Chess 2012 应用程序根据可用的空间量调整其内容。通过最大化应用程序窗口,我们可以调整整个棋盘的大小。
function main() { startApplication("chess2012"); mouseClick(waitForImage("start_game")); mouseClick(waitForImage("white_pawn")); }
如果使用 Chess 2012 应用程序的最大化窗口执行上述测试用例,图像搜索将失败,并将显示 Image Not Found dialog。
图像未找到对话框
我们可以尝试选择自动修复图像搜索错误。复选框并允许Squish启用容错图像搜索模式并调整其参数。自动修复程序并不完美,风险是图像搜索可能会包含不正确的匹配。相反,我们将点击调整搜索参数按钮打开图像搜索预览对话框。对话框将尝试降低阈值直到找到任何匹配项。它显示图像搜索参数并允许根据当前设置值操纵它以观察搜索预览。
图像搜索预览
目前,自动计算出的值应该是正确的,我们可以通过点击设置为默认值按钮来确认它们。这将把默认图像搜索参数设置为上面显示的值并继续测试脚本执行。
图像搜索参数的默认值可以在测试套件设置视图的图像搜索选项卡上进行编辑。
通过图像搜索验证
到目前为止,图像搜索的唯一目的是后来的交互,比如插入 > 鼠标点击(<图像>) 动作。图像的存在(或不存在)也可以用于测试GUI状态,回答像:警告标志出现了吗?状态图标是红色还是绿色?或其他情况(比如对我们国际象棋应用程序的测试):哪位玩家的回合是 twists?
为了验证是白方玩家的回合,我们将记录Verify > Search Image的搜索图像验证,我们首先截取包含文本标签现在是白方的回合。的图像。我们将名称设置为whites_turn
。
记录的脚本语句将是
test.imagePresent("whites_turn")
请注意,找不到特定图像无法100%排除信息不是以不同的视觉外观显示的情况。一个图像的缺失并不总是表示另一个像素状态肯定存在。因此,建议一个图像的失败检查之后进行其预期替代品的检查。换句话说,当我们期望文本现在是黑方的回合的视觉表示时,对于期望的显示读取是白方玩家的回合的失败检查是不够的。我们需要预期的替代品。
©2024 Qt公司。本文档的贡献中包含的版权属于其各自的所有者。
本提供的文档根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款进行许可。
Qt和相应的标志是芬兰及其它国家的Qt公司商标。所有其他商标均为其各自所有者的财产。