代码开发
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 设备,并自动化操作其自带的“记事本”应用,完成文本输入、文件保存等任务。
脚本操作流程:
- 连接远程设备;
- 启动记事本;
- 输入文本;
- 点击菜单保存文件;
- 设置保存路径并保存;
- 关闭记事本;
- 断开远程连接。
示例代码:
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
实例中获取
在远程脚本中,所有自动化库(如 winAuto
、util
、keyboard
、mouse
等)必须从远程连接返回的 auto
实例中获取。直接从本地导入将导致代码在本地执行,而非远程。
- 正确方式 (从
auto
实例中获取):PythonAuto = auto.winAuto Keyboard = auto.keyboard
- 错误方式 (本地导入):
Python
from leanproAuto import Util # ❌ 错误,这会导致代码在本地运行
2. 仅支持远程目标平台上的自动化类型
远程连接返回的 auto
实例只会包含目标平台支持的自动化能力。例如,如果您连接到一台远程 Windows 设备,则无法访问 Linux 特有的 atkAuto
。在脚本中尝试使用不支持的库(例如 auto.atkAuto
),将会引发错误。
在编写脚本前,请务必确认目标远程平台所支持的自动化类型。