跨平台Qt录制基础
CukeTest的脚本录制功能支持Qt应用的录制。在一个操作系统上录制的脚本可以在其他平台上执行。
录制的原理
录制的原理仍基于CukeTest本身的对象识别技术,因此对于能够访问到的控件,生成的脚本是直接操作控件、调用控件上的方法来重现事件,保证可靠性和稳定性。
同时CukeTest的录制也会记录操作点的相对坐标,来记录当前操作的是控件的哪个位置。保证了一些对于坐标有要求的操作(如绘图、画线、标点等),并且由于是相对控件本身的坐标而不是传统的桌面坐标,不容易受环境和应用尺寸的影响。对于某些不需要相对坐标的控件,例如Button的点击,则不会录制相对坐标。如果对用户而言点击控件中心区域即可,不需要精确的相对坐标,可以在录制结束后删除不需要的坐标信息。
录制Qt脚本步骤
- 在CukeTest中创建一个Qt项目。
- 配置录制设置中的Qt录制。录制设置是全局起作用的,因此只需配置一次。
- 点击录制按钮边的下拉箭头,选择“Qt录制”选项,让录制按钮切换到Qt录制。
- 点击录制按钮启动录制
- 操作Qt应用
- 停止录制。
录制生成两个文件:脚本和模型。脚本维护操作信息、模型维护被操作控件的定位信息,从而使维护更加方便。下面介绍生成的脚本代码。
代码生成
CukeTest的录制生成的脚本非常的浅显易懂,也很好编辑,下面是生成的脚本:
const { RunSettings } = require("leanpro.common");
const { QtAuto } = require("leanpro.qt");
let model = QtAuto.loadModel(__dirname + "/recording.tmodel");
RunSettings.slowMo = 1000;
(async () => {
//启动Qt应用"standarddialogs"
await QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe");
await model.getApplication("standarddialogs").exists(10);
//点击 "QInputDialog::getInt()"
await model.getButton("QInputDialog::getInt()").click()
//设置控件值为"12"
await model.getSpinBox("SpinBox").set("12")
//点击 "OK"
await model.getButton("OK").click()
//点击 "QInputDialog::getDouble()"
await model.getButton("QInputDialog::getDouble()").click()
//关闭Qt应用"standarddialogs"
await model.getApplication("standarddialogs").quit();
})();
import os
from leanproAuto import RunSettings, QtAuto
RunSettings.set({"slowMo": 1000, "reportSteps": True})
modelQt = QtAuto.loadModel(os.path.dirname(__file__) + "/recording.tmodel")
#启动应用 "SimpleStyles.exe"
QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe")
modelQt.getApplication("standarddialogs").exists(10)
#点击 "QInputDialog::getInt()"
modelQt.getButton("QInputDialog::getInt()").click()
#设置控件值为"12"
modelQt.getSpinBox("SpinBox").set("12")
#点击 "OK"
modelQt.getButton("OK").click()
#点击 "QInputDialog::getDouble()"
modelQt.getButton("QInputDialog::getDouble()").click()
#关闭Qt应用"standarddialogs"
modelQt.getApplication("standarddialogs").quit()
除去顶部的引用以外,JavaScript脚本调用前后包裹的
(async () => {
和})()
称作异步的IIFE(立即执行函数表达式),帮助用户可以直接运行脚本 。
脚本中的每个操作都配有一行注释介绍步骤操作。每个调用中可以分为三个部分分别描述了操作的组成:
- 控件类型:断言当前被操作控件的类型。
- 对象名称:模型文件
tmodel
中的目标节点的名称。 - 操作方法:对控件执行的操作。
//---|控件类型|对象名称|操作方法|
await model.getButton("OK").click()
#---|控件类型|对象名称|操作方法|
model.getButton("OK").click()
生成模型
录制生成的模型与脚本文件同名,如录制的脚本文件名为recording.js
,那么对应的模型文件就是recording.tmodel
。打开模型,这个模型保存着脚本中所有被操作控件的信息。,点击后会在模型管理器中打开。右击根节点选择启动应用,打开我们的被测应用。接着选中模型里面的一个对象,可以看到它在被测应用中对应的控件被高亮。
生成启动/关闭应用代码
所有跨平台Qt应用在被自动化操作前都应该以指定的方式启动,录制也不例外。有以下几种启动方式:
- 可以直接在录制设置面板中设置录制时启动应用。启动应用的操作会被录制下来。
- 可以在录制启动后,通过Qt应用的启动中的一种方式启动。这样启动应用的操作也会被录制下来。
- 如果在录制之前启动的Qt应用,不会生成启动应用的代码。所以在回放前要先确认脚本要操作的应用已启动。
启动应用通常会生成两代码:
//启动Qt应用"standarddialogs"
await QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe");
await model.getApplication("standarddialogs").exists(10);
#启动Qt应用"standarddialogs"
QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe")
modelQt.getApplication("standarddialogs").exists(10)
第一行是运行应用,第二行是等待应用真正加载,缺省最长等待10秒。如果您的应用实际加载时间超过这个时间,可以手动修改生成代码。
应用退出时会生成类似下面的退出代码。
//关闭Qt应用"standarddialogs"
await model.getApplication("standarddialogs").quit();
#关闭Qt应用"standarddialogs"
modelQt.getApplication("standarddialogs").quit()
生成回放速度控制代码
CukeTest的录制默认打开了slowMo
(“慢动作”)这个开关,并设为1000,及将各个操作的间隔延长至少到1秒,以便观察它的回放。如果想让自动化以最快的速度运行,这可以将其设为0,或注释掉这行代码。
生成的脚本中设置了
slowMo
的值:
const { RunSettings } = require("leanpro.common");
// ……
RunSettings.slowMo = 1000;
from leanproAuto import RunSettings
RunSettings.set({"slowMo": 1000})
录制生成脚本的后继处理
如同其他类型应用的脚本录制,录制脚本记录的是手工操作的各种行为。但并非所有的操作都是自动化测试所关心的,所以在录制完成之后,可以根据需要手工删除不需要的操作代码,然后回放验证,验证之后将录制的脚本片段添加到完整的脚本项目中。
例如鼠标在菜单上悬停的时候会生成MenuItem上的hover()操作,如果觉得实际用点击触发菜单项就够了的话,可以手动删除多余的hover()操作。当然不删除这样的操作对执行测试也是无害的。
如果录制生成的脚本在回放中出错了怎么办?需不需要重新录?通常情况下,都不用重新录,你可以简单快速地对生成的录制结果进行编辑。修改脚本或是模型都可以改变自动化测试的运行效果,不需要总是重新录制。例如回放验证中,如果报告回放未找到对象,可以打开模型,在对应的模型中查看未定位到的对象,它的识别属性,它的父对象的定位结果。某些被测应用的对象属性可能在不同的运行之间会变化,就需要调整这些定位参数的信息。