Qt自动化模块介绍
在CukeTest中,跨平台Qt相关的自动化对象集中在leanpro.qt模块中。该模块是CukeTest中用于跨平台Qt应用自动化的核心模块。它提供了加载模型和执行自动化操作的功能,简化了Qt应用的测试流程。通过该模块,您可以启动Qt应用、加载模型文件、操作应用中的控件,以及识别已运行的进程进行自动化测试。
类型定义
QtAuto类在leanpro.qt模块中提供了多个静态方法,用于管理和操作Qt应用的自动化过程:
引用方式
在脚本顶部加入下面的脚本引用QtAuto类
const { QtAuto } = require('leanpro.qt');from leanproAuto import QtAuto| 方法名 | 描述 |
|---|---|
| getApplication | 获取目标Qt应用的自动化对象,用于执行后续的自动化操作。 |
| launchQtProcess | 同步启动一个Qt应用 |
| launchQtProcessAsync | 使用高级选项异步启动一个Qt应用,适用于需要指定环境变量、工作目录等条件的场景。 |
| winHookProcess | 将当前自动化进程挂接到目标进程(通过 PID、名称或对象),用于 Windows 环境下的进程注入。 |
| loadModel | 从模型文件中加载模型,模型中包含了各种控件的自动化API。 |
class QtAuto {
static defaultTimeout: number;
static getApplication(appName: string): IQApplication;
static launchQtProcess(exePath: string | string[], ...args: string[]): ChildProcess;
static launchQtProcessAsync(exePath: string | string[], ...args: string[]): Promise<ChildProcess>;
static launchQtProcessAsync(exePaths: string, args: string[], options: SpawnOptions): ChildProcess;
static winHookProcess(pidOrNameOrProcess: number | string | object): Promise<void>;
static loadModel(modelPath: string): IQtModel;
}class QtAuto(QtContainer):
def getApplication(appName: Union[str, TypedDict]) -> "QApplication"
def launchQtProcessAsync(exePaths: Union[str, List[str]]) -> "ChildProcess"
def winHookProcess(pidOrNameOrProcess: Union[str, int, TypedDict]) -> None
def loadModel(modelPath: str) -> "QtModel"在使用QtAuto类之前,您需要先从leanpro.qt模块中引入该类。以下是不同语言的引入方式:
const { QtAuto } = require('leanpro.qt');from leanproAuto import QtAuto以下是QtAuto类中主要方法的详细介绍,包括参数说明、返回值以及使用示例。
loadModel(modelPath): IQtModel
从模型文件中加载模型,模型中包含了各种控件的自动化API。
参数
modelPath(string): 模型文件的路径。
返回值
IQtModel: 模型类,包含了各类Qt对象操作API。
使用示例
const { QtAuto } = require('leanpro.qt');
let model = QtAuto.loadModel(__dirname + '/Model1.tmodel');from leanproAuto import QtAuto
model = QtAuto.loadModel(__dirname + '/Model1.tmodel')提示:您可以直接将模型文件从CukeTest的文件管理视图中拖拽到代码编辑器中,自动生成模型加载代码。
launchQtProcessAsync(exePath, args, options): Promise<ChildProcess>
使用高级选项异步启动一个Qt应用,适用于需要指定环境变量、工作目录等条件的场景。此方法会自动加载Qt Agent,确保Qt自动化功能正常工作。
参数
exePath(string|string[]): 应用的路径。如果传入字符串数组,将逐个路径尝试,直到找到有效路径后启动。args(string[], 可选): 运行应用时的参数。例如,["--runjs", "test.js"]。options(SpawnOptions, 可选): 控制进程运行的更多参数,包括环境变量、工作目录等。cwd(string, 默认值:process.cwd()): 子进程的工作目录。env(Object, 默认值:process.env): 环境键值对。detached(boolean): 子进程是否独立于父进程运行。shell(boolean|string): 是否在shell内运行命令,或指定特定的shell。launchTimeout(number, 仅限Qt启动方法, 默认值:10): 准备插件的超时时间,以秒为单位。
返回值
Promise<ChildProcess>: 启动的子进程对象。
使用示例
更多参数用法请参考
Util.launchProcess()
const { QtAuto } = require('leanpro.qt');
async function startApp() {
const child = await QtAuto.launchQtProcessAsync(
"C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe",
["--runjs", "test.js"],
{
cwd: "C:/Program Files/LeanPro/CukeTest/bin/" ,
env: { 'MY_ENV_VAR': 'value' }
}
);
console.log("应用已启动,进程ID:", child.pid);
}
startApp();from leanproAuto import QtAuto
child = QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe", ["--runjs", "test.js"], {"cwd": "C:/Program Files/LeanPro/CukeTest/bin/", 'env': { 'MY_ENV_VAR': 'value' } })
print(f"应用已启动,进程ID: {child.pid}")launchQtProcess(exePath, ...args): ChildProcess
同步启动一个Qt应用。此方法不会等待进程加载好Qt Agent,因此在自动化测试中不推荐使用。
参数
exePath(string|string[]): 应用的路径。如果传入字符串数组,将逐个路径尝试,直到找到有效路径后启动。args(string[], 可选): 运行应用时的参数。
返回值
ChildProcess: 启动的子进程对象。
使用示例
const { QtAuto } = require('leanpro.qt');
let child = QtAuto.launchQtProcess("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe", ["--runjs", "test.js"]);
console.log("应用已启动,进程ID:", child.pid);警告:由于此方法不等待Qt Agent加载完成,可能导致自动化操作不稳定,建议优先使用
launchQtProcessAsync方法。
getApplication(appName): IQApplication
获取目标Qt应用的自动化对象,用于执行后续的自动化操作。
参数
appName(string): Qt应用的名称。
返回值
IQApplication: 目标应用的自动化对象。
使用示例
const { QtAuto } = require('leanpro.qt');
let app = QtAuto.getApplication("standarddialogs");
app.launch();from leanproAuto import QtAuto
app = QtAuto.getApplication("standarddialogs")
app.launch()winHookProcess(pidOrNameOrProcess): Promise<void>
在Windows平台下,为已运行的Qt应用加载Qt Agent,以实现自动化控制。在Linux和Mac平台下,该方法为空操作。
参数
pidOrNameOrProcess(number|string|object): 可以是进程ID(PID)、进程名称或ChildProcess对象。number: 进程ID(PID)。string: 进程的可执行文件名,如"fetchmore.exe"。object: 由Util.launchProcess返回的ChildProcess对象。
返回值
Promise<void>: 无返回值,仅表示操作完成。
使用示例
const { QtAuto } = require('leanpro.qt');
const { Util } = require("leanpro.common");
async function hookProcess() {
const aut = Util.launchProcess("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe");
await Util.delay(3000); // 等待应用完全启动
await QtAuto.winHookProcess(aut); // 方式一:传入ChildProcess对象
await QtAuto.winHookProcess("standarddialogs.exe"); // 方式二:传入进程名称
let app = QtAuto.getApplication("standarddialogs");
await app.exists(10);
}
hookProcess();from leanproAuto import Util, QtAuto
def hook_process():
aut = Util.launchProcess("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe")
Util.delay(3000) # 等待应用完全启动
QtAuto.winHookProcess("standarddialogs.exe") # 传入进程名称
app = QtAuto.getApplication("standarddialogs")
app.exists(10)
hook_process()注意:在自动化脚本运行时,如果Qt应用已经打开,或Qt应用不是由自动化脚本直接启动的,需要调用
winHookProcess方法加载Qt Agent,以实现对应用的控制。
Qt自动化的超时时间
在Qt自动化测试中,每个操作都有一个超时时间。如果操作执行时间超过设定的超时时间,将触发错误。这些错误主要包括:
- 超时错误:当操作执行时间超过超时时间时,系统会报超时错误。
- 对象未找到错误:如果在超时时间内,控件未变为可见状态,将报"对象未找到"错误。
defaultTimeout 属性
QtAuto类中的defaultTimeout属性用于设置Qt自动化操作的默认超时时间,单位为毫秒(ms)。默认值为5000(即5秒)。您可以通过修改此属性来调整所有Qt操作的超时时间。
获取当前超时时间:
const { QtAuto } = require('leanpro.qt');
console.log(QtAuto.defaultTimeout); // 输出当前超时时间,例如 5000设置新的超时时间:
const { QtAuto } = require('leanpro.qt');
QtAuto.defaultTimeout = 10000; // 设置超时时间为10秒注意:将
defaultTimeout设置为较大的值可以避免因界面延迟或系统负载导致的超时错误,但也可能延长测试运行时间。根据实际需求合理调整此值。