diff --git a/packages/rpa-core/src/engine/engine-driver.test.ts b/packages/rpa-core/src/engine/engine-driver.test.ts new file mode 100644 index 0000000..36a9b5b --- /dev/null +++ b/packages/rpa-core/src/engine/engine-driver.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from "vitest"; +import { createEngine } from "./engine"; +import { WindowsDriver } from "../driver/windows/windows-driver"; + +describe("driver 平台自动选择(迁移指南五件小事 #2)", () => { + it("win32 上惰性创建 WindowsDriver 且实例缓存", () => { + const engine = createEngine(); + expect(engine.driver).toBeInstanceOf(WindowsDriver); + expect(engine.driver).toBe(engine.driver); + }); + + it("非 win32 访问 driver 抛 platform_unsupported", () => { + const engine = createEngine(); + const original = process.platform; + Object.defineProperty(process, "platform", { value: "darwin", configurable: true }); + try { + expect(() => engine.driver).toThrowError(/暂不支持桌面自动化驱动/); + } finally { + Object.defineProperty(process, "platform", { value: original, configurable: true }); + } + }); +}); diff --git a/packages/rpa-core/src/engine/engine.ts b/packages/rpa-core/src/engine/engine.ts index 9f55a1e..d8ee81a 100644 --- a/packages/rpa-core/src/engine/engine.ts +++ b/packages/rpa-core/src/engine/engine.ts @@ -2,6 +2,7 @@ import type { Client } from "basic-ftp"; import type { Workbook as ExcelJSWorkbook } from "exceljs"; import { WindowsDriver } from "../driver/windows/windows-driver"; import type { AutomationDriver } from "../driver/types"; +import { RuntimeError } from "./types"; /** 人为拟真操作的开关与随机参数(desktop 能力的进程级设置)。 */ export interface ManualOperationSettings { @@ -41,8 +42,23 @@ export class RpaEngine { minMs: 1000, maxMs: 3000 }; - /** 桌面自动化驱动(任务 3.4 注入点,默认 PowerShell 版 WindowsDriver) */ - readonly driver: AutomationDriver = new WindowsDriver(); + /** 桌面自动化驱动:按系统自动选(迁移指南五件小事 #2)。win32 用 PowerShell 版 WindowsDriver; + * 其他平台尚未实现,访问时抛 platform_unsupported 明确报错(惰性创建,避免 import 即炸) */ + private _driver?: AutomationDriver; + get driver(): AutomationDriver { + if (!this._driver) { + if (process.platform === "win32") { + this._driver = new WindowsDriver(); + } else { + throw new RuntimeError( + "platform_unsupported", + `该平台暂不支持桌面自动化驱动(当前:${process.platform})`, + { recommendation: "桌面/键鼠/窗口能力目前仅支持 Windows;macOS/Linux 驱动在迁移指南三端计划中规划" } + ); + } + } + return this._driver; + } } export function createEngine(): RpaEngine { diff --git a/packages/rpa-core/src/engine/error-codes.ts b/packages/rpa-core/src/engine/error-codes.ts index b71ee2c..7f1779f 100644 --- a/packages/rpa-core/src/engine/error-codes.ts +++ b/packages/rpa-core/src/engine/error-codes.ts @@ -40,6 +40,7 @@ export const RUNTIME_ERROR_CODES = [ "word_text_not_found", "outlook_unavailable", // 其他 + "platform_unsupported", "decryption_failed", "host_unavailable" ] as const;