传统合成监控通常依赖 CSS 选择器、XPath 和固定点击顺序。页面一旦调整 DOM、按钮文案或弹窗位置,脚本就可能失败,即使真实用户仍能正常完成操作。Amazon Nova Act 提供了一种更偏向“理解任务并操作浏览器”的执行方式,再结合 Amazon Bedrock AgentCore 托管运行,可以把登录、搜索、结账前检查等用户旅程包装成持续执行、可观测的监控任务。
这里的重点不是用智能体取代所有断言,而是把容易碎裂的页面操作交给智能体,同时保留确定性的成功标准、超时、隔离和告警。
从元素脚本转向“意图 + 检查点”
传统脚本经常把实现细节写死:
page.locator('#login-form > div:nth-child(2) input').fill(password)
page.locator('button.primary.large').click()
这种脚本检查的是“某个元素是否仍在原位置”。面向任务的旅程则可以表达为:
- 使用专用测试账户登录;
- 搜索指定商品;
- 将商品加入购物车;
- 确认购物车中出现正确名称和数量;
- 在产生付款、发货或数据修改之前停止。
页面布局变化时,智能体仍可能根据文本、视觉信息和上下文找到正确入口。不过,语义操作不应成为模糊验收的借口。每一步之后仍要设置明确检查点,例如“订单摘要中必须出现测试商品 SKU”“当前页面不能出现账户锁定提示”。
一个实用的分层方式是:
- 动作层:由 Nova Act 执行自然语言描述的浏览器任务。
- 断言层:要求返回严格的 PASS/FAIL,必要时再用页面 URL、API 或数据库查询进行二次确认。
- 运行层:由 AgentCore 承载任务,统一处理身份、超时、日志和扩缩容。
- 调度与告警层:定期触发旅程,把延迟、失败阶段和错误原因送入监控系统。
托管运行时应该承担什么
可以采用下面的逻辑架构。具体服务配置应根据账户区域、AgentCore 版本和组织安全要求调整:
EventBridge Scheduler / CI
|
v
Bedrock AgentCore Runtime
|
+--> Nova Act browser journey
| |
| +--> application under test
|
+--> structured logs and metrics
|
+--> dashboard / alarm / incident system
AgentCore 不只是脚本托管位置。一个可靠的运行单元还应具备:
- 每次运行使用独立会话,避免 Cookie 和购物车状态相互污染;
- 为整个旅程和单个步骤分别设置超时;
- 限制可访问域名,防止任务偏离目标系统;
- 从密钥服务注入测试账户,不把密码写入提示词文件或日志;
- 输出结构化结果,包括旅程名称、步骤、耗时、失败类别和运行标识;
- 对失败进行有限重试,并区分页面偶发抖动与稳定故障。
不要无限重试。连续重试可能掩盖真实可用性问题,也会放大浏览器运行和模型调用成本。常见做法是最多重试一次,并在指标中同时记录首次结果与最终结果。
可改造的最小旅程示例
下面的示例假设当前 Nova Act Python SDK 提供 NovaAct(starting_page=...) 和 act(...) 接口。安装方式、认证方式及返回对象字段可能随 SDK 版本变化,接入时应以所在环境的 SDK 文档为准。示例本身展示的是可复用的旅程结构、严格检查点和机器可读指标。
先创建 journey.yaml,把域名、任务描述和断言改成自己的测试环境:
name: catalog-smoke
start_url: https://staging.example.com
steps:
- name: open-catalog
task: Open the product catalog from the main navigation.
checkpoint: The catalog page is visible and contains at least one product card.
- name: search-product
task: Search for the product with SKU SYNTHETIC-001.
checkpoint: A search result whose SKU is exactly SYNTHETIC-001 is visible.
- name: inspect-product
task: Open the matching product detail page. Do not add it to the cart or place an order.
checkpoint: The page shows SKU SYNTHETIC-001 and a price, and no error banner is visible.
安装依赖:
python -m venv .venv
source .venv/bin/activate
pip install nova-act PyYAML
再保存以下 monitor.py:
import json
import sys
import time
from pathlib import Path
import yaml
from nova_act import NovaAct
def result_text(result) -> str:
for attribute in ('response', 'text', 'message'):
value = getattr(result, attribute, None)
if value:
return str(value).strip()
return str(result).strip()
def emit_metric(journey: str, duration_ms: int, failed: bool, failed_step: str = ''):
print(json.dumps({
'_aws': {
'Timestamp': int(time.time() * 1000),
'CloudWatchMetrics': [{
'Namespace': 'Synthetic/NovaAct',
'Dimensions': [['Journey']],
'Metrics': [
{'Name': 'Duration', 'Unit': 'Milliseconds'},
{'Name': 'Failure', 'Unit': 'Count'}
]
}]
},
'Journey': journey,
'Duration': duration_ms,
'Failure': 1 if failed else 0,
'FailedStep': failed_step
}))
def run(config_path: str) -> None:
config = yaml.safe_load(Path(config_path).read_text(encoding='utf-8'))
journey = config['name']
started = time.monotonic()
current_step = ''
try:
with NovaAct(starting_page=config['start_url']) as browser_agent:
for step in config['steps']:
current_step = step['name']
print(json.dumps({
'event': 'step_started',
'journey': journey,
'step': current_step
}))
browser_agent.act(step['task'])
verification_prompt = (
'Inspect the current browser state only. '
f"Condition: {step['checkpoint']} "
'Return exactly PASS if the condition is true; otherwise return exactly FAIL.'
)
verification = result_text(browser_agent.act(verification_prompt)).upper()
if verification != 'PASS':
raise RuntimeError(
f'Checkpoint failed for {current_step}: {verification}'
)
print(json.dumps({
'event': 'step_passed',
'journey': journey,
'step': current_step
}))
duration_ms = int((time.monotonic() - started) * 1000)
emit_metric(journey, duration_ms, failed=False)
except Exception as exc:
duration_ms = int((time.monotonic() - started) * 1000)
print(json.dumps({
'event': 'journey_failed',
'journey': journey,
'step': current_step,
'error_type': type(exc).__name__,
'error': str(exc)
}), file=sys.stderr)
emit_metric(journey, duration_ms, failed=True, failed_step=current_step)
raise
if __name__ == '__main__':
run(sys.argv[1] if len(sys.argv) > 1 else 'journey.yaml')
本地运行:
python monitor.py journey.yaml
部署到 AgentCore 时,可以把配置文件与执行器打包为同一个工作负载,也可以让运行时根据事件参数读取不同旅程。例如调度器发送:
{
"journey": "catalog-smoke",
"config": "journeys/catalog-smoke.yaml",
"environment": "staging"
}
生产实现中,最好不要只依赖智能体对 PASS 的判断。对于关键步骤,可以增加第二条确定性证据:查询只读订单 API、检查后端健康状态,或者核对测试数据是否产生预期变化。这样既保留了自然语言操作的适应性,也降低了模型误判造成的假阳性。
韧性来自边界,而不只是模型能力
智能体驱动的浏览器任务仍然会遇到网络延迟、A/B 页面、Cookie 横幅、验证码和站点限流。设计时可以把失败分成几类:
- 业务失败:页面打开了,但商品不可搜索、登录失败或关键文本缺失;
- 环境失败:DNS、TLS、浏览器启动或依赖服务异常;
- 策略阻断:验证码、机器人防护或访问权限拒绝执行;
- 智能体不确定性:无法判断下一步,或者没有按要求返回严格结果。
这些类别应该使用不同告警。业务失败通常需要应用团队处理;策略阻断可能需要调整测试入口或白名单;智能体不确定性则可能通过收紧任务描述、缩短旅程或增加确定性定位手段解决。
还要防范页面中的提示注入。被监控页面属于智能体的输入,恶意或意外文本可能诱导它偏离任务。应限制访问域名和允许动作,为测试账户设置最小权限,并明确禁止付款、删除、发送消息等不可逆操作。
上线前检查清单
适合优先迁移的,是那些业务价值高、页面经常变化、但结果容易验证的用户旅程。纯 API 健康检查或稳定的单元素检查通常没有必要引入智能体。
上线前建议确认:
- 使用专用、低权限、可随时重置的测试账户;
- 旅程不会真实付款、发货、发送邮件或污染生产数据;
- 每一步都有清晰检查点,关键结果还有 API 或数据层佐证;
- 设置了总超时、步骤超时和有限重试;
- 日志会脱敏,不记录密码、会话令牌和个人信息;
- 指标至少包含成功率、总耗时、失败步骤和失败类别;
- 页面访问范围和智能体动作受到约束;
- 保留少量确定性探针,用于区分应用故障与智能体运行故障。
Nova Act 与 Bedrock AgentCore 的组合价值,在于让合成监控从脆弱的 DOM 自动化转向更贴近用户意图的托管旅程。但可靠性仍来自工程约束:可验证的结果、最小权限、清晰的失败分类,以及对成本和不确定性的持续度量。