Loading...
Loading...
Compare original and translation side by side
patrol--devicepatrol--deviceundefinedundefined
**First-time setup:** See [macOS Setup Guide](./setup/macos-setup.md) for entitlements and window constraints.
**首次设置:** 请查看[macOS设置指南](./setup/macos-setup.md)了解权限和窗口约束相关内容。--ioslatestundefined--ioslatestundefined
Use `xcrun simctl list devices booted` to find the device ID and OS version.
**First-time setup:** See [iOS Setup Guide](./setup/ios-setup.md) for RunnerUITests target and simulator OS matching.
使用`xcrun simctl list devices booted`命令查找设备ID和系统版本。
**首次设置:** 请查看[iOS设置指南](./setup/ios-setup.md)了解RunnerUITests目标和模拟器系统版本匹配的相关要求。adb devicesundefinedadb devicesundefined
**Note:** Android emulators use `10.0.2.2` to reach the host's `localhost`.
**First-time setup:** See [Android Setup Guide](./setup/android-setup.md) for AVD creation, JDK, and Google APIs image requirement.
**注意:** Android模拟器需使用`10.0.2.2`来访问主机的`localhost`。
**首次设置:** 请查看[Android设置指南](./setup/android-setup.md)了解AVD创建、JDK和Google APIs镜像的要求。undefinedundefined
**First-time setup:** See [Web Setup Guide](./setup/web-setup.md) for Node.js, CORS, and viewport details.
If `$ARGUMENTS` is empty or "all", run against `integration_test/` (all tests).
If `$ARGUMENTS` is a filename like `smoke_test.dart`, run that specific file.
**首次设置:** 请查看[网页设置指南](./setup/web-setup.md)了解Node.js、CORS和视口的相关细节。
如果`$ARGUMENTS`为空或为"all",则运行`integration_test/`目录下的所有测试。
如果`$ARGUMENTS`是类似`smoke_test.dart`的文件名,则运行该指定文件。--no-auth-modepatrol --versiondart analyze integration_test/patrol test--no-auth-modepatrol --versiondart analyze integration_test/patrol testwaitForConditionharness.waitForLogtester.pump(duration)waitForConditionharness.waitForLogtester.pump(duration)patrolTest('description', ($) async {
await verifyBackendOrFail(backendUrl);
ignoreKeyboardAssertions();
final harness = TestLogHarness();
await harness.initialize();
try {
await pumpTestApp($, harness);
// ... test body ...
} catch (e) {
harness.dumpLogs(last: 50);
rethrow;
} finally {
harness.dispose();
}
});patrolTest('description', ($) async {
await verifyBackendOrFail(backendUrl);
ignoreKeyboardAssertions();
final harness = TestLogHarness();
await harness.initialize();
try {
await pumpTestApp($, harness);
// ... 测试主体代码 ...
} catch (e) {
harness.dumpLogs(last: 50);
rethrow;
} finally {
harness.dispose();
}
});| Target | Finder |
|---|---|
| Room list items | |
| Chat input | |
| Send button | |
| Chat messages | |
| Settings icon | |
find.bySemanticsLabelenterText| 目标 | 查找器 |
|---|---|
| 房间列表项 | |
| 聊天输入框 | |
| 发送按钮 | |
| 聊天消息 | |
| 设置图标 | |
find.bySemanticsLabelenterText| Logger | Pattern | Meaning |
|---|---|---|
| | App booted, router active |
| | Rooms API called |
| | Rooms parsed successfully |
| | AG-UI SSE stream opened |
| | First text chunk received |
| | SSE stream completed |
| 日志器 | 模式 | 含义 |
|---|---|---|
| | 应用已启动,路由激活 |
| | 调用了房间列表API |
| | 房间列表解析成功 |
| | AG-UI SSE流已开启 |
| | 收到首个文本块 |
| | SSE流已完成 |
flutter runflutter runmcp__dart-tools__launch_appmcp__dart-tools__launch_app → starts app, returns DTD URI
mcp__dart-tools__connect_dart_tooling_daemon → connect to running app
mcp__dart-tools__get_widget_tree(summaryOnly: true) → see real widget hierarchy
mcp__dart-tools__get_app_logs(pid, maxLines: 50) → see stdout log output
mcp__dart-tools__get_runtime_errors → check for exceptions[DEBUG] Router: redirect called for /harness.expectLog()widgetRuntimeTypefind.byType()mcp__dart-tools__launch_appmcp__dart-tools__launch_app → 启动应用,返回DTD URI
mcp__dart-tools__connect_dart_tooling_daemon → 连接到运行中的应用
mcp__dart-tools__get_widget_tree(summaryOnly: true) → 查看实际Widget层级
mcp__dart-tools__get_app_logs(pid, maxLines: 50) → 查看标准输出日志
mcp__dart-tools__get_runtime_errors → 检查异常信息[DEBUG] Router: redirect called for /harness.expectLog()widgetRuntimeTypefind.byType()TestLogHarnessMemorySinkharness.expectLog('Router', 'redirect called')harness.waitForLog('ActiveRun', 'RUN_FINISHED')harness.dumpLogs(last: 50)[DEBUG]get_app_logsTestLogHarnessMemorySinkharness.expectLog('Router', 'redirect called')harness.waitForLog('ActiveRun', 'RUN_FINISHED')harness.dumpLogs(last: 50)get_app_logs[DEBUG]flutterdartunset GIT_DIR0.0.0-unknownscripts/flutterdartunset GIT_DIR0.0.0-unknownscripts/| Symptom | Cause | Fix |
|---|---|---|
| "Multiple devices found" prompt | Missing | Add |
| | Add to PATH or use full path |
| Test hangs on "Waiting for app" | Entitlements missing/wrong | See macOS setup |
| GIT_DIR set in worktree | Use |
| "did not appear within 10s" | Widget in drawer, not body | See macOS setup |
| Finder matched Semantics, not TextField | Use |
| Accessibility permission denied | Entitlements changed | Re-approve in System Settings > Privacy > Accessibility |
| iOS: xcodebuild exit code 70 | | See iOS setup |
| iOS: "Device ... is not attached" | Wrong device ID format | Use UUID from |
| Android: "No connected devices" | Emulator not running or | See Android setup |
| Android: connection refused to localhost | Emulator can't reach host localhost | Use |
| Android: Gmail login prompt on boot | AVD uses Google Play image | See Android setup |
| Chrome: "Cannot find module playwright" | Node.js not installed | See Web setup |
| Chrome: CORS error in test | Backend missing CORS headers | See Web setup |
Chrome: "Failed to fetch" on | Backend offline or CORS block | Start backend; check browser console |
| 症状 | 原因 | 解决方法 |
|---|---|---|
| 出现"Multiple devices found"提示 | 缺少 | 添加 |
| | 将其添加到PATH或使用完整路径 |
| 测试在"Waiting for app"步骤挂起 | 权限缺失或错误 | 查看macOS设置指南 |
版本显示 | 工作树中设置了GIT_DIR | 使用 |
| 提示"did not appear within 10s" | Widget在抽屉中而非主内容区 | 查看macOS设置指南 |
| 查找器匹配到Semantics而非TextField | 改用 |
| 权限被拒绝 | 权限设置已更改 | 在系统设置>隐私与安全性>辅助功能中重新授权 |
| iOS:xcodebuild退出码70 | | 查看iOS设置指南 |
| iOS:提示"Device ... is not attached" | 设备ID格式错误 | 使用 |
| Android:提示"No connected devices" | 模拟器未运行或 | 查看Android设置指南 |
| Android:连接localhost被拒绝 | 模拟器无法访问主机的localhost | 使用 |
| Android:启动时出现Gmail登录提示 | AVD使用了Google Play镜像 | 查看Android设置指南 |
| Chrome:提示"Cannot find module playwright" | 未安装Node.js | 查看网页设置指南 |
| Chrome:测试中出现CORS错误 | 后端缺少CORS头 | 查看网页设置指南 |
Chrome: | 后端未启动或被CORS阻止 | 启动后端服务;检查浏览器控制台 |