代码开发

CukeTest 支持远程自动化,让您能够在本地开发、调试和执行远程设备上的自动化脚本。本文将详细介绍如何编写远程自动化脚本,并提供一个完整的 Windows 记事本自动化示例。

远程连接 API

CukeTest.connect() / sync_auto()

要进行远程自动化,您首先需要连接到远程的 CukeTest Worker 服务。CukeTest.connect()(JavaScript)和 sync_auto()(Python)方法就是为此设计的。

JavaScript
Python
interface CukeTest {
    connect(options: ClientConnectOptions): Promise<IAuto>;
}
def sync_auto(options: ClientConnectOptions) -> AutoContextManager

这两个方法都会返回一个远程自动化实例(Auto),通过这个实例您可以访问远程设备上的所有自动化功能,例如鼠标键盘屏幕Qt 自动化等。这些远程对象提供了与本地对象完全相同的接口,让您可以像编写本地脚本一样编写远程脚本。

Auto

远程自动化实例包含了所有可用的自动化库:

JavaScript
Python
export interface IAuto {
    capabilities(): Promise<ICapabilities>;
    close(): void;
    readonly runSettings: IRunSettings;
    readonly mouse: IMouse;
    readonly screen: IScreen;
    readonly keyboard: IKeyboard;
    readonly winAuto: IWinAuto;
    readonly qtAuto: IQtAuto;
    readonly util: IUtil;
}
class Auto(SyncContextManager):
    def mouse() -> Mouse
    def keyboard() -> Keyboard
    def screen() -> Screen
    def util() -> Util
    def runSettings() -> RunSettings
    def winAuto() -> WinAuto
    def qtAuto() -> QtAuto
    def cuketest() -> CukeTest
    def visual() -> Visual
    def capabilities() -> "any"

RunSettings

RunSettings 对象用于配置远程脚本的运行时行为,例如设置操作的超时时间或慢动作。

JavaScript
Python
interface IRunSettingsOptions {
    defaultTimeout?: number;
    slowMo?: number;
}
interface IRunSettings {
    set(setting: IRunSettingsOptions): Promise<void>;
    get(): Promise<IRunSettingsOptions>;
}
class RunSettingOptions:
    defaultTimeout: int
    slowMo: int
    reportSteps: bool

class RunSettings(SyncBase):
    defaultTimeout: int
    slowMo: int
    def set(options: TypedDict) -> "None"
    def get() -> "any"

例如,下面的代码会将每个操作的慢动作设置为 1 秒:

JavaScript
Python
auto.runSettings.set({slowMo: 1000});
auto.runSettings.set({"slowMo": 1000, "reportSteps": True})

远程自动化实战:Windows 记事本

以下示例展示了如何连接到一台远程 Windows 10 设备,并自动化操作其自带的“记事本”应用,完成文本输入、文件保存等任务。

脚本操作流程:

  1. 连接远程设备;
  2. 启动记事本;
  3. 输入文本;
  4. 点击菜单保存文件;
  5. 设置保存路径并保存;
  6. 关闭记事本;
  7. 断开远程连接。

示例代码:

JavaScript
Python
const { CukeTest } = require("cuketest");

(async () => {
    // 1. 连接远程设备
    let auto = await CukeTest.connect({
        wsEndpoint: 'ws://192.168.1.10:3131/ws'
    });

    // 从远程实例中获取自动化库
    const { runSettings: RunSettings, winAuto: Auto, util: Util } = auto;

    // 配置运行设置
    await RunSettings.set({ slowMo: 1000, reportSteps: true });
    let modelWin = await Auto.loadModel(__dirname + "/recording.tmodel");

    // 2. 启动记事本
    let proc = await Util.launchProcess("C:\\Windows\\System32\\notepad.exe");
    
    // 3. 输入文本
    await modelWin.getDocument("文本编辑器").set("Hello World");
    
    // 4. 点击菜单保存文件
    await modelWin.getMenuItem("文件(F)").click(20, 5);
    await modelWin.getMenuItem("保存(S)").click(45, 5);
    
    // 5. 设置保存路径并保存
    await modelWin.getEdit("文件名:1").set("C:\\temp\\helloworld.txt");
    await modelWin.getButton("保存(S)1").click();
    
    // 6. 关闭记事本
    await modelWin.getButton("关闭").click();

    // 7. 退出远程进程并断开连接
    await Util.stopProcess(proc);
    auto.close();
})();
import os
from auto.sync_api import sync_auto

def recording():
    # 1. 连接远程设备
    with sync_auto('ws://192.168.1.10:3131/ws') as auto:
        # 从远程实例中获取自动化库
        RunSettings = auto.runSettings
        Auto = auto.winAuto
        Util = auto.util

        # 配置运行设置
        RunSettings.set({"slowMo": 1000, "reportSteps": True})
        modelWin = Auto.loadModel(os.path.dirname(os.path.realpath(__file__)) + "/recording_1.tmodel")

        # 2. 启动记事本
        proc = Util.launchProcess("C:\\Windows\\System32\\notepad.exe")
        
        # 3. 输入文本
        modelWin.getDocument("文本编辑器").set("Hello World")
        
        # 4. 点击菜单保存文件
        modelWin.getMenuItem("文件(F)").click(33, 2)
        modelWin.getMenuItem("保存(S)").click(50, 15)
        
        # 5. 设置保存路径并保存
        modelWin.getEdit("文件名:1").set("C:\\temp\\helloworld.txt")
        modelWin.getButton("保存(S)1").click()
        
        # 6. 关闭记事本
        modelWin.getButton("关闭").click()

        # 7. 退出远程进程
        Util.stopProcess(proc)

if __name__ == "__main__":
    recording()

脚本开发中的注意事项

在编写远程自动化脚本时,请务必注意以下几点,以确保脚本能够顺利执行:

1. 自动化库必须从 auto 实例中获取

在远程脚本中,所有自动化库(如 winAutoutilkeyboardmouse 等)必须从远程连接返回的 auto 实例中获取。直接从本地导入将导致代码在本地执行,而非远程。

  • 正确方式 (从 auto 实例中获取):
    Python
    Auto = auto.winAuto
    Keyboard = auto.keyboard
  • 错误方式 (本地导入):
    Python
    from leanproAuto import Util  # ❌ 错误,这会导致代码在本地运行

2. 仅支持远程目标平台上的自动化类型

远程连接返回的 auto 实例只会包含目标平台支持的自动化能力。例如,如果您连接到一台远程 Windows 设备,则无法访问 Linux 特有的 atkAuto。在脚本中尝试使用不支持的库(例如 auto.atkAuto),将会引发错误。

在编写脚本前,请务必确认目标远程平台所支持的自动化类型。

results matching ""

    No results matching ""