跨平台Qt录制基础

CukeTest 提供的脚本录制功能支持对 Qt 应用程序进行录制。录制过程中,工具将自动生成易于维护和编辑的脚本及模型文件。这些脚本和模型具有跨平台特性,可以在不同操作系统中执行。

录制原理

CukeTest 的录制功能基于对象识别技术。当录制过程中,CukeTest能够访问应用程序中的各个控件,并生成相应的操作脚本。这些脚本通过直接操作控件或调用控件方法来重现用户的操作,从而确保测试脚本的可靠性和稳定性。

此外,录制过程中,CukeTest 会记录操作点的相对坐标,即操作在控件内部的位置。这一机制保证了诸如绘图、画线、标点等对坐标有严格要求的操作的准确性。由于使用的是控件自身的相对坐标,而非传统的桌面坐标,这些操作不易受到不同环境和应用尺寸变化的影响。对于不需要精确坐标的控件(如按钮点击),CukeTest 默认不会记录相对坐标。如果用户只需点击控件的中心区域,可以在录制完成后手动删除这些多余的坐标信息。

录制步骤

以下是使用CukeTest录制Qt应用脚本的详细步骤:

  1. 创建Qt项目:打开CukeTest,创建一个新的Qt项目。

  2. 配置录制设置:进入录制设置页面,配置Qt录制相关参数。由于录制设置是全局生效的,仅需配置一次即可。

  3. 选择Qt录制模式:点击录制按钮旁的下拉箭头,选择“Qt录制”选项,使录制按钮切换到Qt录制模式。

  4. 启动录制:点击录制按钮,开始录制操作。

  5. 操作Qt应用:在录制过程中,按照实际使用场景对Qt应用进行操作,CukeTest将自动记录这些操作。

  6. 停止录制:完成操作后,点击停止录制按钮。

录制完成后,CukeTest 会生成两个文件:脚本文件模型文件。脚本文件记录了具体的操作内容,而模型文件则保存了被操作控件的定位信息,便于后续维护和管理。

录制生成的脚本代码

CukeTest 生成的脚本简洁明了,易于理解和编辑。以下是生成的脚本示例:

JavaScript
Python
const { RunSettings } = require("leanpro.common");
const { QtAuto } = require("leanpro.qt");
(async () => {
    await RunSettings.set({slowMo: 1000, reportSteps: true});

    let modelQt = QtAuto.loadModel(__dirname + "/recording.tmodel");


    //启动Qt应用文件"standarddialogs"
    await QtAuto.launchQtProcessAsync("C:\\Program Files\\LeanPro\\CukeTest\\bin\\standarddialogs.exe");

    //等待Qt应用"standarddialogs"
    await modelQt.getApplication("standarddialogs").exists(10);

    //点击 "QInputDialog::getInt()"
    await modelQt.getButton("QInputDialog::getInt()").click();

    //设置控件值为"12"
    await modelQt.getSpinBox("QSpinBox").set("12");

    //点击 "OK"
    await modelQt.getButton("OK").click();

    //关闭Qt应用"standarddialogs"
    await modelQt.getApplication("standarddialogs").quit();
})();
import os
from leanproAuto import RunSettings, QtAuto

def recording_3():

    RunSettings.set({"slowMo": 1000, "reportSteps": True})

    modelQt = QtAuto.loadModel(os.path.dirname(os.path.realpath(__file__)) + "/recording.tmodel")

    
    #启动Qt应用文件"standarddialogs"
    QtAuto.launchQtProcessAsync("C:\\Program Files\\LeanPro\\CukeTest\\bin\\standarddialogs.exe")
    
    #等待Qt应用"standarddialogs"
    modelQt.getApplication("standarddialogs").exists(10)
    
    #点击 "QInputDialog::getInt()"
    modelQt.getButton("QInputDialog::getInt()").click()
    
    #设置控件值为"12"
    modelQt.getSpinBox("QSpinBox").set("12")
    
    #点击 "OK"
    modelQt.getButton("OK").click()
    
    #关闭Qt应用"standarddialogs"
    modelQt.getApplication("standarddialogs").quit()


if __name__ == "__main__":
    recording_3()

:JavaScript脚本中的(async () => { ... })();被称为异步立即执行函数表达式(IIFE),用于使脚本能够直接运行。

脚本结构

脚本中每个操作步骤都配有注释,便于理解。操作调用通常包括以下三个部分:

  1. 控件类型:当前操作的控件类型。
  2. 对象名称:模型文件tmodel中目标节点的名称。
  3. 操作方法:对控件执行的具体操作。

示例:

JavaScript
Python
//---|控件类型|对象名称|操作方法| 
await model.getButton("OK").click()
#---|控件类型|对象名称|操作方法| 
model.getButton("OK").click()

生成的模型文件

录制完成后,CukeTest 会生成与脚本同名的模型文件(例如,脚本文件为recording.js,对应的模型文件为recording.tmodel)。模型文件保存了所有被操作控件的信息,方便后续的维护和管理。

模型文件的使用

  1. 打开模型

    • 在CukeTest中双击模型文件,模型管理器将自动打开。
  2. 查看控件信息

    • 右击模型中的根节点,选择“启动应用”,此时被测应用将启动。
    • 在模型管理器中选中一个控件,对应的应用控件将被高亮显示,便于确认和调试。

录制生成的模型示意图

生成启动/关闭应用代码

为了确保跨平台Qt应用在自动化操作前正确启动,CukeTest 提供了多种启动方式,录制过程中会自动生成相关代码:

应用启动方式

  1. 通过录制设置启动:在录制设置面板中配置应用启动参数,录制时CukeTest将自动启动并记录应用的启动过程。

  2. 在录制过程中启动:录制开始后,可以使用Qt应用的启动中的任意一种方式启动应用,启动过程同样会被记录。

  3. 预先启动应用:如果在录制前已手动启动应用,CukeTest不会自动生成启动代码。因此,在回放前需确保应用已启动。

启动应用

JavaScript
Python
//启动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秒。如果您的应用实际加载时间超过这个时间,可以手动修改生成代码。

关闭应用

JavaScript
Python
//关闭Qt应用"standarddialogs"
await model.getApplication("standarddialogs").quit();
#关闭Qt应用"standarddialogs"
modelQt.getApplication("standarddialogs").quit()

提示:如果关闭应用的操作是由某个点击事件触发的,且该点击事件已在脚本中生成相应代码,则可以手动删除冗余的关闭代码。

生成回放速度控制代码

CukeTest 录制功能默认启用了slowMo(慢动作)设置,延长各操作之间的间隔时间,以便用户观察回放过程。默认值为1000毫秒(1秒)。如果希望测试脚本以最快速度运行,可以将slowMo设置为0,或直接注释掉相关代码。

JavaScript
Python
const { RunSettings } = require("leanpro.common");  
// ……  
RunSettings.slowMo = 1000;
from leanproAuto import RunSettings
RunSettings.set({"slowMo": 1000})

录制脚本的后续处理

录制生成的脚本记录了所有手工操作,但并非所有操作都是自动化测试所需的。因此,建议在录制完成后对脚本进行必要的编辑和优化:

  1. 删除不必要的操作

    • 例如,录制过程中鼠标悬停菜单项会生成hover()操作。如果实际测试只需点击菜单项,可以手动删除多余的hover()操作。即便不删除,这些操作通常也不会影响测试结果。
  2. 编辑和优化脚本

    • 如果回放过程中出现错误,通常不需要重新录制。可以通过编辑现有脚本或模型文件来修正问题。例如:
      • 对象未找到:检查模型文件中对应控件的识别属性,确保其在不同运行环境下的稳定性。
      • 调整标识属性:某些控件属性可能在运行期间动态变化,需要手动调整标识属性以提高识别准确性。
  3. 验证回放

    • 编辑完成后,进行回放验证,确保脚本按预期运行。验证通过后,可以将录制的脚本片段集成到完整的测试项目中。

示例:删除多余操作

假设录制过程中生成了以下代码:

JavaScript
// 鼠标悬停 "MenuItem::File"
await model.getMenuItem("MenuItem::File").hover();

// 点击 "MenuItem::File"
await model.getMenuItem("MenuItem::File").click();

如果测试仅需点击菜单项,可以删除hover()操作:

JavaScript
// 点击 "MenuItem::File"
await model.getMenuItem("MenuItem::File").click();

results matching ""

    No results matching ""