用 Amazon Nova Act 扩展 UX 测试:从文档生成场景到并行执行用户流程

2026-07-15 32 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

传统端到端测试擅长验证确定性的页面行为,却很难覆盖大量接近真实用户表达的操作路径。Amazon Nova Act 提供了另一种思路:让生成式 AI 从产品文档中提取测试意图,再利用智能导航能力执行用户流程,最后把运行轨迹转化为可定位、可排序的问题。真正重要的变化不只是“用自然语言操作浏览器”,而是让 UX 测试可以并行扩展。

把测试用例从脚本提升为用户意图

一条传统 UI 自动化脚本通常紧贴 DOM:查找按钮、填写输入框、等待特定选择器。页面结构稍有变化,脚本就可能失败。面向用户流程的测试则更关注目标,例如:

  • 新用户能否完成注册并进入控制台;
  • 用户能否找到某个套餐并理解价格差异;
  • 结账失败后,页面是否给出可执行的恢复路径;
  • 键盘用户能否完成搜索、筛选和提交。

生成式 AI 可以读取需求文档、帮助中心文章或验收标准,将这些材料整理成结构化场景。为了避免模型输出无法执行,场景应使用固定的数据契约,而不是直接生成任意代码。

可以这样定义一个最小场景文件:

id: checkout-existing-user
start_url: https://staging.example.com/login
persona: 已注册且希望快速完成购买的用户
goal: 登录后购买购物车中的商品
steps:
  - 使用测试账号登录
  - 打开购物车
  - 确认商品数量为 1
  - 使用测试支付方式完成结账
assertions:
  - 页面显示订单确认信息
  - 用户可以看到订单编号
  - 流程中没有无法恢复的错误
risk: high
tags:
  - checkout
  - regression

文档生成器需要校验 start_urlgoalassertions 等必填字段,并限制允许访问的域名。模型负责扩展覆盖面,测试平台负责约束输出边界。

云端平台需要拆开生成、执行和分析

要扩展到数百条用户流程,不能把所有工作塞进一个长时间运行的进程。可以将平台拆成四个阶段:

  1. 场景生成:读取产品文档,生成带版本号的 YAML 或 JSON 场景。
  2. 任务调度:将每个场景写入队列,并附加环境、浏览器和重试策略。
  3. 隔离执行:每个 worker 启动独立浏览器会话,通过 Nova Act 完成目标。
  4. 结果分析:汇总轨迹、截图、耗时和失败原因,输出按影响范围排序的问题。

在 AWS 上可以这样实践:用对象存储保存场景和截图,用消息队列缓冲任务,用容器任务或 Kubernetes Job 承载浏览器 worker,再把结构化结果写入数据库。具体服务不是关键,关键是让一个场景对应一个可重放、可超时、可追踪的执行单元。

下面的 Kubernetes Job 展示了 worker 的基本部署方式。运行前需要替换镜像地址、测试站点和 Secret 名称;Nova Act 的认证变量应以当前 SDK 文档为准。

apiVersion: batch/v1
kind: Job
metadata:
  name: ux-flow-worker
spec:
  backoffLimit: 1
  activeDeadlineSeconds: 900
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: worker
          image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/ux-worker:latest
          env:
            - name: SCENARIO_FILE
              value: /work/scenarios/checkout.yaml
            - name: ALLOWED_HOSTS
              value: staging.example.com
            - name: NOVA_ACT_API_KEY
              valueFrom:
                secretKeyRef:
                  name: nova-act-credentials
                  key: api-key
          resources:
            requests:
              cpu: "1"
              memory: 2Gi
            limits:
              cpu: "2"
              memory: 4Gi

并发量不应只由队列长度决定,还要考虑测试环境容量、账号池、第三方 API 限流,以及同一数据被多个流程同时修改的风险。

用 Nova Act 执行结构化场景

下面是一个可改造的最小 Python worker。它采用公开示例中常见的 NovaAct 上下文管理方式,将 YAML 中的步骤逐条交给智能导航代理。不同版本 SDK 的初始化参数和结果对象可能变化,接入时应按所使用版本调整;测试账号也应来自专用测试环境,而不是生产账户。

安装依赖并设置凭证:

python -m venv .venv
source .venv/bin/activate
pip install nova-act PyYAML
export NOVA_ACT_API_KEY='replace-with-your-key'
python worker.py checkout.yaml

worker.py

import json
import sys
import time
from pathlib import Path
from urllib.parse import urlparse

import yaml
from nova_act import NovaAct


def load_scenario(path: str) -> dict:
    scenario = yaml.safe_load(Path(path).read_text(encoding="utf-8"))
    required = {"id", "start_url", "goal", "steps", "assertions"}
    missing = required - scenario.keys()
    if missing:
        raise ValueError(f"Missing fields: {sorted(missing)}")

    allowed_hosts = {"staging.example.com"}
    host = urlparse(scenario["start_url"]).hostname
    if host not in allowed_hosts:
        raise ValueError(f"Host is not allowed: {host}")
    return scenario


def run(path: str) -> None:
    scenario = load_scenario(path)
    started = time.time()
    records = []

    try:
        with NovaAct(starting_page=scenario["start_url"]) as agent:
            for step in scenario["steps"]:
                result = agent.act(step)
                records.append({"type": "step", "text": step, "result": str(result)})

            for assertion in scenario["assertions"]:
                prompt = f"Verify this condition without changing application data: {assertion}"
                result = agent.act(prompt)
                records.append({"type": "assertion", "text": assertion, "result": str(result)})

        status = "completed"
        error = None
    except Exception as exc:
        status = "failed"
        error = f"{type(exc).__name__}: {exc}"

    report = {
        "scenario_id": scenario["id"],
        "status": status,
        "duration_seconds": round(time.time() - started, 2),
        "error": error,
        "records": records,
    }
    print(json.dumps(report, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    if len(sys.argv) != 2:
        raise SystemExit("Usage: python worker.py SCENARIO.yaml")
    run(sys.argv[1])

这个示例刻意保留了清晰的输入和输出边界。生产实现还应采集截图、页面 URL、浏览器控制台错误、网络失败和每一步耗时,并将敏感字段从日志中清除。

分析失败,而不是只统计通过率

智能代理执行失败并不必然等于产品缺陷。失败可能来自页面问题,也可能来自测试账号失效、环境不稳定、导航模型误判或场景本身含糊。因此,分析层至少需要区分:

  • 产品阻塞:用户无法继续,页面也没有明确恢复方式;
  • 体验摩擦:流程能够完成,但出现反复导航、标签歧义或过长等待;
  • 测试设施问题:浏览器崩溃、凭证过期、环境返回 5xx;
  • 代理不确定性:相同场景多次执行得到不一致结果;
  • 场景缺陷:目标依赖未准备的数据,或验收条件无法观察。

对高风险流程可以重复执行三到五次,并保存成功率和路径差异。如果一次失败、四次成功,应先标记为不稳定,而不是立即阻断发布。涉及付款、删除和权限变更的流程,则应在隔离数据集上运行,并设置人工审批或明确的动作禁区。

上线前的采用清单

落地这类平台时,建议从少量高价值旅程开始:注册、登录、搜索、结账和账户恢复通常比穷举页面元素更有价值。上线前应确认以下事项:

  • 测试只访问允许域名,并与生产数据隔离;
  • 每个场景拥有明确目标、前置条件和可观察断言;
  • worker 有超时、重试上限和全链路追踪标识;
  • 截图与日志经过密钥、个人信息和支付数据脱敏;
  • 确定性回归仍由常规自动化测试承担;
  • AI 流程测试用于发现未知路径、文案歧义和交互摩擦;
  • 发布门禁只采用经过重复验证且误报率可控的指标。

Nova Act 的价值不在于替代现有测试栈,而在于补充传统脚本难以覆盖的用户意图。把生成、执行和分析做成可审计的流水线之后,团队才能在扩大覆盖面的同时,知道每一个结论来自哪里,也知道何时不应该相信它。


相关推荐