diff --git a/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_0_3p5_q.png b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_0_3p5_q.png new file mode 100644 index 0000000..4a479c6 Binary files /dev/null and b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_0_3p5_q.png differ diff --git a/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_1_12m7_q.png b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_1_12m7_q.png new file mode 100644 index 0000000..e63b6e8 Binary files /dev/null and b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_1_12m7_q.png differ diff --git a/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_2_6t4_q.png b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_2_6t4_q.png new file mode 100644 index 0000000..44af9a9 Binary files /dev/null and b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_2_6t4_q.png differ diff --git a/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_3_15p28_q.png b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_3_15p28_q.png new file mode 100644 index 0000000..b347d01 Binary files /dev/null and b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_3_15p28_q.png differ diff --git a/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_4_9t9_q.png b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_4_9t9_q.png new file mode 100644 index 0000000..5cfc219 Binary files /dev/null and b/packages/rpa-core/src/capabilities/__fixtures__/captcha/captcha_4_9t9_q.png differ diff --git a/packages/rpa-core/src/capabilities/captcha-caps.test.ts b/packages/rpa-core/src/capabilities/captcha-caps.test.ts index c313186..8da3e6a 100644 --- a/packages/rpa-core/src/capabilities/captcha-caps.test.ts +++ b/packages/rpa-core/src/capabilities/captcha-caps.test.ts @@ -1,4 +1,5 @@ import { existsSync } from "node:fs"; +import path from "node:path"; import { describe, expect, it } from "vitest"; import { getHandler } from "../engine/registry"; import type { CatalogComponent, FlowNode } from "../types"; @@ -7,7 +8,10 @@ import "./remaining-core"; import "./captcha-caps"; // last-wins:覆盖 remaining-core 的通用实现 import { cleanCodeText, parseCalculation } from "./captcha-caps"; -const ctx = { signal: new AbortController().signal, log: () => {}, vars: {}, evidenceDir: "D:/office-test2/ocr-test" } as unknown as RunContext; +// 测试图随仓库走(__fixtures__/captcha,PIL 生成),真实 OCR 模型来自 npm 依赖 +const fixturesDir = path.join(import.meta.dirname, "__fixtures__", "captcha"); +const fixture = (name: string) => path.join(fixturesDir, `${name}.png`); +const ctx = { signal: new AbortController().signal, log: () => {}, vars: {}, evidenceDir: fixturesDir } as unknown as RunContext; const node: FlowNode = { id: "smoke", componentId: "smoke", position: { x: 0, y: 0 }, values: {}, options: {} }; describe("parseCalculation 解析层(纯逻辑)", () => { @@ -36,7 +40,7 @@ describe("parseCalculation 解析层(纯逻辑)", () => { }); }); -describe.skipIf(!existsSync("D:/office-test2/ocr-test/captcha_0_3p5_q.png"))("OCR_CalculationCode 端到端(真实模型)", () => { +describe.skipIf(!existsSync(fixture("captcha_0_3p5_q")))("OCR_CalculationCode 端到端(真实模型)", () => { const cases: Array<[string, string]> = [ ["captcha_0_3p5_q", "8"], ["captcha_1_12m7_q", "5"], @@ -48,7 +52,7 @@ describe.skipIf(!existsSync("D:/office-test2/ocr-test/captcha_0_3p5_q.png"))("OC it(`${file} -> ${expected}`, async () => { const handler = getHandler("OCR_CalculationCode"); expect(handler).toBeTruthy(); - const out = await handler!(ctx, node, { path: `D:/office-test2/ocr-test/${file}.png` }, {} as CatalogComponent); + const out = await handler!(ctx, node, { path: fixture(file) }, {} as CatalogComponent); console.log(`[${file}]`, String(out)); expect(String(out)).toBe(expected); }, 300000);