Qt自动化模块介绍

在CukeTest中,跨平台Qt相关的自动化对象集中在leanpro.qt模块中。该模块是CukeTest中用于跨平台Qt应用自动化的核心模块。它提供了加载模型和执行自动化操作的功能,简化了Qt应用的测试流程。通过该模块,您可以启动Qt应用、加载模型文件、操作应用中的控件,以及识别已运行的进程进行自动化测试。

类型定义

QtAuto类在leanpro.qt模块中提供了多个静态方法,用于管理和操作Qt应用的自动化过程:

JavaScript
Python
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模块中引入该类。以下是不同语言的引入方式:

JavaScript
Python
const { QtAuto } = require('leanpro.qt');
from leanproAuto import QtAuto

以下是QtAuto类中主要方法的详细介绍,包括参数说明、返回值以及使用示例。

loadModel(modelPath): IQtModel

从模型文件中加载模型,模型中包含了各种控件的自动化API。

参数

  • modelPath (string): 模型文件的路径。

返回值

使用示例

JavaScript
Python
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>: 启动的子进程对象。

使用示例

JavaScript
Python
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: 启动的子进程对象。

使用示例

JavaScript
Python
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: 目标应用的自动化对象。

使用示例

JavaScript
Python
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对象。

    1. number: 进程ID(PID)。
    2. string: 进程的可执行文件名,如"fetchmore.exe"
    3. object: 由Util.launchProcess返回的ChildProcess对象。

返回值

  • Promise<void>: 无返回值,仅表示操作完成。

使用示例

JavaScript
Python
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自动化测试中,每个操作都有一个超时时间。如果操作执行时间超过设定的超时时间,将触发错误。这些错误主要包括:

  1. 超时错误:当操作执行时间超过超时时间时,系统会报超时错误。
  2. 对象未找到错误:如果在超时时间内,控件未变为可见状态,将报"对象未找到"错误。

defaultTimeout 属性

QtAuto类中的defaultTimeout属性用于设置Qt自动化操作的默认超时时间,单位为毫秒(ms)。默认值为5000(即5秒)。您可以通过修改此属性来调整所有Qt操作的超时时间。

获取当前超时时间

JavaScript
const { QtAuto } = require('leanpro.qt');
console.log(QtAuto.defaultTimeout); // 输出当前超时时间,例如 5000

设置新的超时时间

JavaScript
const { QtAuto } = require('leanpro.qt');
QtAuto.defaultTimeout = 10000; // 设置超时时间为10秒

注意:将defaultTimeout设置为较大的值可以避免因界面延迟或系统负载导致的超时错误,但也可能延长测试运行时间。根据实际需求合理调整此值。

results matching ""

    No results matching ""