Qt自动化模块介绍
在CukeTest中,跨平台Qt相关的自动化对象集中在leanpro.qt
模块中。该模块是CukeTest中用于跨平台Qt应用自动化的核心模块。它提供了加载模型和执行自动化操作的功能,简化了Qt应用的测试流程。通过该模块,您可以启动Qt应用、加载模型文件、操作应用中的控件,以及识别已运行的进程进行自动化测试。
类型定义
QtAuto
类在leanpro.qt
模块中提供了多个静态方法,用于管理和操作Qt应用的自动化过程:
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>
: 启动的子进程对象。
使用示例
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/" });
console.log("应用已启动,进程ID:", child.pid);
}
startApp();
from leanproAuto import QtAuto
async def start_app():
child = await QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe", ["--runjs", "test.js"], {"cwd": "C:/Program Files/LeanPro/CukeTest/bin/"})
print(f"应用已启动,进程ID: {child.pid}")
import asyncio
asyncio.run(start_app())
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);
from leanproAuto import QtAuto
child = QtAuto.launchQtProcess("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe", ["--runjs", "test.js"])
print(f"应用已启动,进程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
设置为较大的值可以避免因界面延迟或系统负载导致的超时错误,但也可能延长测试运行时间。根据实际需求合理调整此值。