跳转到内容

编程智能体可以像真人一样测试你的应用的注册流程:构建应用,在 iOS Simulator 中运行,用 Proxy Mail QA 测试地址填写表单,然后输入验证码或打开邮件中的链接。Proxy Mail QA 为智能体提供地址以及邮件中的验证码或链接;智能体用自己的工具操控模拟器。

下面每种设置都要先把 Proxy Mail QA 连接到智能体:粘贴一句提示词设置,或手动连接 MCP server。

在让智能体测试你自己的应用之前,可以先用 iOS 示例试一试:一个带邮件激活、不需要服务器的小型注册应用。你从自己的邮箱账号亲自发送它的激活邮件,智能体从 Proxy Mail QA 获取验证码。

Claude Code Desktop 的 iOS Simulator 面板

Section titled “Claude Code Desktop 的 iOS Simulator 面板”

Mac 上的 Claude Code Desktop 可以在对话旁边的模拟器中运行你的应用,点按操作并读取屏幕内容(Anthropic 的指南)。它需要安装了 iOS 平台的 Xcode,并且每个模拟器都需要你允许 Claude 使用一次。

在连接了 Proxy Mail QA 的 Claude Code Desktop 会话中打开你的 iOS 项目,然后输入:

构建应用并在模拟器中运行。用一个新的 Proxy Mail QA 测试地址注册,使用它给你的密码,然后输入邮件中的验证码,并检查应用是否显示账号已验证。

然后 Claude 会:

  1. 构建应用并在模拟器中启动。
  2. 调用 create_address(带 password: true),获取一个新地址和密码。
  3. 点按进入注册表单并输入它们。
  4. 调用 wait_for_code(或 wait_for_link)获取邮件中的验证码或链接。
  5. 输入验证码,或在模拟器上打开链接,让应用处理它。打开链接遵循你会话的权限模式。

如果链接应该打开应用,就明确要求这个链接:“在应用中打开邮件里的验证链接”。如果邮件中同时有网页链接和应用链接(myapp://…),网页链接排在前面;wait_for_link 带 app: true(或 REST API 的 app=true)会获取应用链接。应用链接打开应用前,iOS 会询问“在你的应用中打开?”,Claude 会点按 打开。

模拟器屏幕显示某个步骤可能会稍有延迟,所以 Claude 在点按按钮前会通过截图确认输入的内容,并在判定步骤失败前再截一张图。

模拟器面板的截图和对话的其他内容一样会发送给 Anthropic,所以在该模拟器上只使用测试账号。Proxy Mail QA 的地址和密码本身就是测试账号。

Claude Code 或 Codex 搭配 Xcode 的工具

Section titled “Claude Code 或 Codex 搭配 Xcode 的工具”

Xcode 可以通过 Xcode 自带的 MCP server,把它的构建和项目工具共享给你在它之外运行的智能体(Apple 的指南):

  1. 在 Xcode 中选择 Xcode → Settings → Intelligence,在 Model Context Protocol 下打开 Allow external agents to use Xcode tools。

  2. 把 Xcode 的工具添加到智能体:

    claude mcp add --transport stdio xcode -- xcrun mcpbridge

    对于 Codex:

    codex mcp add xcode -- xcrun mcpbridge
  3. 在 Xcode 中打开你的项目,然后按上面的方式向智能体发出提示。

两个服务器都连接后,智能体通过 Xcode 构建,并通过 Proxy Mail QA 获取测试地址和邮件。

Xcode 的内置智能体(Claude Agent、Codex 和 Gemini)可以从 ~/Library/Developer/Xcode/CodingAssistant/ 下的配置文件夹(ClaudeAgentConfig、codex 和 gemini)读取额外的 MCP 服务器,也可以从 Intelligence settings → Plug-ins → Add Plug-in 安装智能体插件(Apple 的指南)。

我们的 Claude Code 插件 包含 MCP server 和一个描述注册流程的技能;在那里通过 URL 添加它,应该能让 Xcode 的 Claude Agent 获得同样的工具。我们还没有测试 Xcode 的插件支持,如果不可用,请改用 Claude Code 或 Codex 搭配 Xcode。

无论智能体以哪种方式连接,它都能覆盖流程的更多部分:

  • 分格输入的验证码。 很多应用每位数字一个输入框。智能体点按第一个框并输入完整验证码,大多数应用会自动分配到各个框中,然后在继续前检查每一位都已填入:不完整的验证码会算作一次错误尝试。
  • 更长的注册表单。 如果表单还要求填写有规则的用户名、出生日期或国家,form_values 会从为它新建的地址中为每个字段给出一个值。
  • 邮件本身。 收到验证码或链接后,check_email 在 expect_host 设为你应用链接打开的域名(例如它的 Universal Link 域名)时,会检查链接是否指向那里,并检查 SPF、DKIM、DMARC 以及注明的有效期。count_emails 能发现误发的第二封邮件。
  • Mac 上的开发服务器。 模拟器通过 localhost 访问你的 Mac,所以开发构建中指向 localhost:3000 的链接是正常的。让智能体把它标记为开发环境(mark_dev_host),或在项目设置中添加,check_email 就会让这些链接通过,而不是判定失败。
  • 下次使用同一个账号。 让智能体在创建账号时记录账号的使用位置(environment,例如 staging,以及 ios 这样的标签),这样 list_addresses 就能再次找到它。如果 API 密钥 允许读取已保存的密码,get_sign_in 一次调用即可返回账号及其密码。
  • 报告。 要求生成运行报告:智能体先调用 start_run,最后调用 finish_run,它会以 Markdown 返回报告。

同样的工具也能测试应用在注册后发送的内容:

  • 优惠券。 在应用中注册某个优惠后,智能体用 wait_for_code 和 kind: coupon 等待,它会返回优惠券及其折扣、截止日期和到达用时(after_seconds)。智能体把优惠券输入应用的优惠码字段,分格输入的方式与验证码相同。
  • 结账,只在沙盒中进行。 使用 Xcode 中的 StoreKit 测试或应用自带的测试模式,绝不使用真实卡片或进行真实购买。智能体用 record_coupon_result 记录应用的处理结果:accepted、rejected 或 error,以及应用的提示信息。再次使用同一个码可以检查一次性码是否会被拒绝。
  • 以打开应用的链接形式提供的优惠券,例如 myapp://redeem?code=…:wait_for_link 带 app: true 会返回它,智能体用 xcrun simctl openurl booted 和该链接在模拟器上打开它。
  • 每人限一次的优惠。 用同一地址的变体(get_address_variants 会列出,例如 name+promo1@…)再次注册,然后用 check_offers 查看应用是否给了两次优惠。
  • 特殊的名字和密码。 get_name_variants 和 get_password_variants 为表单的其他字段提供值(撇号、重音、其他文字、各类符号、字段长度上限);智能体逐一输入并报告应用的行为。
  • 同意设置。 对于注册时的开关和通知设置,智能体用 record_consent 记录它的选择(以及开关初始是否打开),check_email 按用户画像所在地的规则判断之后的营销邮件。
  • 退订,从应用的设置页面,或在模拟器上打开邮件中的链接:智能体随后调用 mark_unsubscribed,之后 check_unsubscribe 会列出之后收到的所有营销邮件。收据类邮件应该仍会继续收到。

关于 Android,请参阅 用编程智能体测试 Android 应用。

如果要把这项检查保留为在 CI 中运行的 UI 测试,请参阅 iOS(XCUITest),或参阅 Maestro 了解同时覆盖 Android 的流程。它们的辅助函数在测试中做同样的事:检查并统计邮件,以已保存的账号登录或借用一个账号,并把每个测试添加到拉取请求的报告中。

对本页有疑问?

可以用任何语言提问。文档可以立即回答,你也可以把问题发给 Proxy Mail QA 团队,他们会用英文回复。