如何在Python/Appium中提取Android测试设备的网络流量?
在Python/Appium环境中捕获Android应用网络流量的方案
当然有,下面是几种在Python+Appium环境下实现类似Selenium Wire捕获网络流量的实用方案:
方法1:mitmproxy + Appium
mitmproxy是个开源代理工具,能通过Python脚本拦截分析HTTP/HTTPS请求,步骤如下:
- 本地启动mitmdump(mitmproxy的命令行工具),配合自定义脚本捕获请求
- 配置Appium驱动的Android设备代理,指向mitmproxy的服务地址(比如你电脑的本地IP:8080)
- 编写Python脚本监听请求事件,提取所需的网络数据
捕获请求的脚本示例:
from mitmproxy import http class CaptureRequests: def request(self, flow: http.HTTPFlow) -> None: # 提取请求核心信息 print(f"请求URL: {flow.request.url}") print(f"请求方法: {flow.request.method}") print(f"请求头: {dict(flow.request.headers)}") # 也可以把数据写入文件或数据库留存 # 启动命令:在终端运行 `mitmdump -s your_capture_script.py`
Appium代理配置示例:
from appium import webdriver desired_caps = { "platformName": "Android", "deviceName": "你的设备名", "appPackage": "com.your.target.app", "appActivity": ".MainActivity", "proxy": { "proxyType": "MANUAL", "httpProxy": "192.168.x.x:8080", # 替换成你的本地IP和mitmproxy端口 "sslProxy": "192.168.x.x:8080" } } driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
⚠️ 注意:要捕获HTTPS流量,必须在Android设备上安装mitmproxy的CA证书,具体操作可参考mitmproxy官方的设备配置说明。
方法2:tcpdump + Appium
通过Android设备的tcpdump工具抓包,导出后用Python解析,不需要代理:
- 确保设备有root权限,或已安装tcpdump工具
- 启动Appium驱动后,用adb命令启动抓包:
adb shell tcpdump -i any -w /sdcard/app_traffic.pcap
- 测试完成后,把抓包文件拉到本地:
adb pull /sdcard/app_traffic.pcap ./
- 用Python的
scapy库解析pcap文件,提取HTTP流量:
from scapy.all import rdpcap, HTTPRequest, TCP # 读取抓包文件 packets = rdpcap("app_traffic.pcap") for packet in packets: if packet.haslayer(HTTPRequest): http_req = packet[HTTPRequest] print(f"请求方法: {http_req.Method.decode()}") print(f"请求URL: {http_req.Host.decode() + http_req.Path.decode()}")
⚠️ 注意:这种方法抓HTTPS流量只能看到加密后的内容,除非你有应用的SSL私钥或证书,否则无法解析明文。
方法3:BrowserMob Proxy + Appium
BrowserMob Proxy是个可嵌入的HTTP代理,支持通过Python API控制和捕获请求:
- 先安装依赖:
pip install browsermob-proxy,还要下载BrowserMob Proxy的二进制文件 - 启动代理服务,创建代理实例,配置Appium设备代理
- 执行测试后,通过API获取捕获的请求数据
代码示例:
from browsermobproxy import Server from appium import webdriver # 启动BrowserMob Proxy服务,替换成你的二进制文件路径 server = Server("/path/to/browsermob-proxy") server.start() proxy = server.create_proxy() # 配置Appium的desired caps desired_caps = { "platformName": "Android", "deviceName": "你的设备名", "appPackage": "com.your.target.app", "appActivity": ".MainActivity", "proxy": { "proxyType": "MANUAL", "httpProxy": f"{proxy.proxy_host}:{proxy.proxy_port}", "sslProxy": f"{proxy.proxy_host}:{proxy.proxy_port}" } } # 开始捕获请求 proxy.new_har("app_test_traffic") driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps) # 这里执行你的测试操作,比如点击按钮、跳转页面等 # 获取捕获的所有请求 har_data = proxy.har for entry in har_data['log']['entries']: req_info = entry['request'] print(f"URL: {req_info['url']}") print(f"请求方法: {req_info['method']}") # 收尾工作 driver.quit() proxy.close() server.stop()
⚠️ 注意:BrowserMob Proxy对最新Android版本的兼容性可能不如mitmproxy,遇到问题可以试试旧版本的二进制文件。
内容的提问来源于stack exchange,提问作者Jack Gee
相关产品推荐
相关产品推荐

