• 简体中文
  • 像人一样看懂界面
    用自然语言完成 E2E 测试

    Midscene.js 提供基于视觉的 GUI Agent 和自然语言 E2E 测试框架,支持 Web、移动端和桌面应用。

    🔥 最新动态 从 v1.16 起,Midscene 支持使用 Jev 1.4 的视觉能力驱动 E2E 测试。欢迎接入体验

    15k+Github Stars
    MIT完全开源
    #2Github 趋势榜第2名

    用自然语言描述步骤与预期

    按用户的操作意图写步骤,按用户看到的结果写预期。同一个测试意图,可以用 YAML 表达,也可以接入现有 JavaScript 测试。

    YAML · @midscene/test
    Vitest + JavaScript
    beforeEach:
      - gotoUrl: https://your-shop.example
    
    cases:
      - name: "筛选 100 美元以下的耳机"
        steps:
          - aiAct: "搜索耳机,然后将结果筛选为价格低于 100 美元"
          - aiWaitFor: "筛选后的搜索结果已显示"
          - aiAssert: "搜索结果中有商品,且每件商品价格都低于 100 美元"

    为测试而生的 GUI Agent

    Midscene 的 GUI Agent 为已有的 Playwright、Puppeteer 或 JavaScript 测试提供视觉操作与断言能力。

    像人一样观察、操作并验证结果

    Midscene 模拟人类使用应用的方式,真正通过视觉完成任务:观察屏幕、找到目标、执行操作,再检查结果。查看实际案例

    一套 API,覆盖不同平台

    视觉定位不依赖特定的界面渲染结构。各平台适配器提供截图和操作能力,让同一种交互方式覆盖 Web、移动端和桌面应用,也适用于 HTML canvas 等自定义界面。

    平台包名说明
    Web@midscene/webPlaywright · Puppeteer · 桌面 Chrome
    Android@midscene/android真机 / 模拟器 · ADB
    iOS@midscene/ios真机 / 模拟器 · WebDriverAgent
    HarmonyOS@midscene/harmonyHarmonyOS NEXT · HDC
    桌面@midscene/computermacOS · Windows · Linux,支持远程 RDP
    自定义界面@midscene/core提供截图与操作能力,即可接入

    模型选择与成本

    Benchmark 成绩

    全新设计的自然语言 E2E 测试框架

    Midscene Test(@midscene/test)是为自然语言 E2E 测试全新设计的框架。在 YAML 中用自然语言描述操作与断言,通过 TypeScript Node 扩展测试步骤,并由框架统一管理数据准备、清理、重试与执行报告。 开始使用 Midscene Test

    AI 步骤与确定性 Node 写在同一个 YAML 里

    用 YAML 组织人和 AI 都能读写的测试用例,让自然语言意图与代码步骤以清晰、可审阅的结构共同维护。

    cases/refund.yaml
    beforeEach:  - order.prepare: { status: paid }Node  - gotoUrl: ${shopUrl}/orders/latestNodecases:  - name: 已支付订单支持全额退款    steps:      - aiAct: 申请全额退款并提交AI      - aiAssert: 页面显示退款申请已提交AI      - order.checkRefund: { status: refunding }NodeafterEach:  - clearCookies: {}Node

    定制属于自己的测试工程

    Midscene Test 提供扩展机制,用 TypeScript 将业务操作定义为 Node,注册后即可在 YAML 中调用。再生成描述可用操作及输入参数的 Markdown Node Spec,让人和 AI 都能据此在用例中引用这些 Node。 开发自定义 Node

    1. nodes/order.ts
      defineNode({
        name: 'order.prepare',
        description: "创建测试订单",
        inputSchema: z.strictObject({
          status: z.literal('paid'),
        }),
        async execute({ input }) {
          await orders.create(input);
        },
      });
    2. midscene-node-spec.md
      ### order.prepare
      创建测试订单
      - status: "paid"
    3. case.yaml
      steps:
        - order.prepare:
            status: paid

    谁在使用 Midscene

    下一步