Skip to content

Commit be7563e

Browse files
committed
执行器策略3改为quitopenauto+BOM修复+备忘录更新
1 parent e857d4f commit be7563e

3 files changed

Lines changed: 57 additions & 6 deletions

File tree

src/controller/miniprogram_runner.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ if (!stepsFile || !fs.existsSync(stepsFile)) {
3434
process.exit(1);
3535
}
3636

37-
const input = JSON.parse(fs.readFileSync(stepsFile, 'utf8'));
37+
const rawContent = fs.readFileSync(stepsFile, 'utf8').replace(/^\uFEFF/, '');
38+
const input = JSON.parse(rawContent);
3839
const PROJECT_PATH = input.project_path || '';
3940
const WS_PORT = input.ws_port || 9420;
4041
const steps = input.steps || [];
@@ -100,22 +101,27 @@ async function initConnect() {
100101
}
101102
}
102103

103-
// 策略3: open+auto(不做close!close会破坏模拟器状态
104-
console.log('[策略3] 执行 open + auto(不close)...');
105-
runCli(`open --project "${PROJECT_PATH}"`);
104+
// 策略3: quit彻底杀进程 → openauto(跟手动修复流程一致
105+
console.log('[策略3] cli quit 彻底杀进程后重启...');
106+
runCli('quit');
106107
await sleep(5000);
108+
console.log('[策略3] cli open...');
109+
runCli(`open --project "${PROJECT_PATH}"`);
110+
await sleep(8000);
111+
console.log('[策略3] cli auto...');
107112
runCli(`auto --project "${PROJECT_PATH}" --auto-port ${WS_PORT}`);
108113
await sleep(3000);
109114
for (let i = 0; i < 5; i++) {
110115
try {
111116
const p = await tryConnect();
112-
console.log('[策略3] open+auto后连接成功,页面: ' + p);
117+
console.log('[策略3] 重启后连接成功,页面: ' + p);
113118
return p;
114119
} catch (e) {
120+
console.log('[策略3] 重试 ' + (i+1) + '/5: ' + e.message);
115121
if (i < 4) await sleep(3000);
116122
}
117123
}
118-
throw new Error('所有策略均失败。请手动在开发者工具中点编译(Ctrl+B)后重试');
124+
throw new Error('所有策略均失败。请确认: 1)微信开发者工具已安装 2)设置→安全设置→已开启服务端口');
119125
}
120126

121127
// ── 执行单个步骤 ──

test_steps.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"project_path":"D:/projects/TestPilotAI/miniprogram-demo","ws_port":9420,"steps":[{"action":"screenshot","description":"首页截图"}]}

开发备忘录.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,50 @@ HTTP服务器已就绪(0.5秒)
981981

982982
---
983983

984+
### v10.4 砍掉桥接服务器+执行器模式(2026-03-08 下午)
985+
986+
**架构变更**:砍掉桥接服务器(`miniprogram_bridge_server.js`),改用一次性Node.js执行器(`miniprogram_runner.js`)。
987+
988+
**新架构**
989+
```
990+
插件 → Python API → 写JSON步骤文件 → node miniprogram_runner.js → 执行步骤 → 输出JSON → Python解析返回
991+
```
992+
`run_blind_test.js`一模一样的模式:Node.js脚本自己做所有事情,跑完就退出。没有长连接、没有桥接服务器、没有端口占用问题。
993+
994+
**三级连接策略**`miniprogram_runner.js`):
995+
```
996+
策略1: 直接connect(模拟器已正常+auto已启动时,0.1秒秒连)
997+
策略2: 只执行cli auto → connect(不close不open)
998+
策略3: cli open + cli auto → connect(不做close!)
999+
```
1000+
1001+
**关键发现和铁律**
1002+
1003+
1. **绝对不能cli close**`cli close`会破坏模拟器状态,之后open回来的模拟器永远是"启动失败: TypeError: Failed to fetch",连`cli cache --clean compile`都救不回来
1004+
2. **开发者工具进程残留问题**`cli quit`不能杀干净所有进程,必须用`Get-Process wechatdevtools | Stop-Process -Force`彻底杀掉后才能干净重启
1005+
3. **模拟器"启动失败"的修复流程**
1006+
```
1007+
① Get-Process wechatdevtools, "微信开发者工具" | Stop-Process -Force
1008+
② 等5秒
1009+
③ cli open --project "项目路径"
1010+
④ 等8秒
1011+
⑤ cli auto --project "项目路径" --auto-port 9420
1012+
⑥ 确认输出 √ auto
1013+
```
1014+
4. **run_blind_test.js会断开auto**:该脚本做了`close→open→auto`重连,跑完后`mp.disconnect()`会断开automator连接,后续其他脚本策略1直连会失败
1015+
5. **SDK方法全部超时**`mp.navigateTo()`, `mp.reLaunch()`等SDK封装方法会10秒超时,必须用`evaluate(() => wx.navigateTo({url:...}))`原生API调用
1016+
6. **PowerShell Out-File会加BOM头**:导致Node.js的`JSON.parse`失败,需要`replace(/^\uFEFF/, '')`去BOM
1017+
7. **项目列表重复**:扫描蓝本时可能存在重复加载,需要去重
1018+
1019+
**修改文件**
1020+
- `src/controller/miniprogram_runner.js`(新增):一次性Node.js执行器,三级连接策略
1021+
- `src/api/routes.py`:小程序蓝本测试改用执行器模式,不再依赖MiniProgramController
1022+
- `src/controller/miniprogram_bridge_server.js`(保留但不再使用)
1023+
1024+
**Git提交**:e857d4f
1025+
1026+
---
1027+
9841028
### 下一步目标(v10.4)
9851029

9861030
#### 优先级1:端到端验证

0 commit comments

Comments
 (0)