You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:42:16