使用http-mitm-proxy无法捕获iPhone应用网络流量求助
解决WebdriverIO结合http-mitm-proxy捕获iPhone应用网络流量无日志问题
核心排查点及修复方案
1. 代理启动与测试执行的异步顺序问题
你的代码中proxy.listen是异步操作,但测试步骤直接在其后执行,可能代理还未完全就绪,导致请求未经过代理。需等待代理启动完成后再执行测试逻辑:
// 将proxy.listen包装为Promise,确保代理就绪后再执行测试 await new Promise((resolve) => { proxy.listen({port: 8081, bindAddress: '0.0.0.0'}, () => { console.log('Proxy server is listening on port 8081'); resolve(); }); });
注意添加bindAddress: '0.0.0.0',确保代理监听所有网络接口,而非仅localhost,这样iPhone才能通过Mac的IP访问代理。
2. 配置WebdriverIO的代理参数
即使WiFi设置了代理,部分iOS应用或WebdriverIO的XCUITest驱动可能需要在Capabilities中明确指定代理,强制应用流量走代理:
在wdio.conf.js的capabilities中添加:
capabilities: [{ // 其他原有配置... 'appium:proxy': { proxyType: 'manual', httpProxy: 'http://你的MacIP:8081', sslProxy: 'http://你的MacIP:8081' } }]
3. 确认证书完全信任
仅安装证书不够,需在iPhone的设置-通用-关于本机-证书信任设置中,开启http-mitm-proxy生成证书的全信任开关,否则HTTPS请求会被拒绝,无法捕获日志。
4. 完善代理错误监听
补充连接和请求错误事件,排查潜在的连接失败问题:
proxy.onConnect((ctx, callback) => { console.log('Client connected:', ctx.clientToProxySocket.remoteAddress); callback(); }); proxy.onRequestError((ctx, err) => { console.error('Request error:', err); });
修改后的完整测试代码示例
import {Proxy} from "http-mitm-proxy"; describe('Calculate perf data', () => { it('Calculate perf data', async () => { const proxy = new Proxy(); proxy.onError((ctx, err) => { console.error('Proxy error:', err); }); proxy.onConnect((ctx, callback) => { console.log('Client connected:', ctx.clientToProxySocket.remoteAddress); callback(); }); proxy.onRequest((ctx, callback) => { console.log('Proxy request:', ctx.clientToProxyRequest.headers.host, ctx.clientToProxyRequest.url); ctx.use(Proxy.gunzip); ctx.onResponseData((ctx, chunk, callback) => { console.log('Response data snippet:', chunk.toString().slice(0, 200)); // 避免日志过长 return callback(null, chunk); }); return callback(); }); proxy.onRequestError((ctx, err) => { console.error('Request error:', err); }); // 等待代理启动完成 await new Promise((resolve) => { proxy.listen({port: 8081, bindAddress: '0.0.0.0'}, () => { console.log('Proxy server is listening on port 8081'); resolve(); }); }); const email = "///XCUIElementTypeTextField"; const pwd = "//XCUIElementTypeSecureTextField[@name=\"text-input-outlined\"]"; const login = "//XCUIElementTypeButton[@name=\"button\"]"; await $(email).setValue("xyz@io.com"); await $(pwd).setValue("xyz"); await $(login).click(); // 测试完成后关闭代理 await new Promise((resolve) => { proxy.close(() => resolve()); }); }); });
内容的提问来源于stack exchange,提问作者user522170
相关产品推荐
相关产品推荐

