一.什么是fiddler?
Fiddler是一款常用的http协议的抓包工具,它的原理是在本机开启一个http的代理服务器,通过它会转发所有的http请求和响应,可以对手机的一些应用进行http抓包.
优点:免费、免费、免费
缺点:
1.仅支持windows系统
2.搜索特定url时耗时较长(charles可以按路径划分请求)
如果是osx系统请使用青花瓷(charles)
二.fiddler安装地址
电脑百度:一般默认第一个就是fiddler下载地址
官网:https://www.telerik.com/fiddler
备注:1.选择对应电脑系统的版本
2.选择你需要下载的版本
三.通过fiddler抓取手机APP应用的数据包
1.前置条件:手机的IP地址与电脑的IP地址需要在同一个网段可以满足(一般使用同一wifi即可)
2.下载安装fiddler并打开(fiddler默认设置先不更改)
3.fiddler一级工具栏--tools--fiddler options--connections--将端口号设置为8888--OK
4.勾选“allow remote computers to connect”(允许远程设备连接)
5.fiddler抓取https请求
fiddler一级工具栏--tools--fiddler options--HTTPS-勾选“capture https connects”--OK
下拉菜单:
a.from remote clients only:仅抓取外部应用的数据包
b.from broswers only:仅抓取电脑网页的数据包
c.from all processes:抓取所有的数据包
若仅抓移动端应用的包,建议选择a选项
ignore server certificateerrors(unsafe):忽略服务器证书
不选择此项,请求部分url会弹各种弹窗,建议勾选
备注:完成之后需要重新启动fiddler
6.手机端设置
确认电脑的ip地址:将鼠标放置于fiddler右上角“online”上方,查看弹窗,确认电脑ip地址
(1):iPhone设备
设置--无线局域网--点击目前连接的wifi--上划到底--HTTP代理--配置代理--手动
服务器:电脑的ip地址
端口:8888(与步骤3设置的端口号一致)
存储(此处以ios11设置为例)
(2):安卓设备
设置-wlan-进入网络详情页(部分设备长按进入/部分设备点击右侧按钮进入)-代理-手动
服务器:电脑的ip地址
端口:8888(与步骤3设置的端口号一致)
保存
(3)安装fiddler证书
建议使用系统自带的浏览器安装证书,iPhone:safari 安卓:系统自带浏览器
网址页输入:“IP地址”+“:”+“8888” 进入如下界面
点击:FIddlerRoot certficate--保存并安装证书
备注:
iPhone:由于ios11加入了部分限制,有2处需要验证
a.设置--通用--描述文件--验证DO_NOT_TRUST_FiddlerRoot
b.设置--通用--关于本机--证书信任设置--信任DO_NOT_TRUST_FiddlerRoot
安卓:安卓7.0以上设备无法抓取https数据包
原因:Android N之后为了增强系统的安全性,不再信任用户导入的CA根证书
解决方法:
a.使用工具(ApkTool/ApkIDE)
b.将下载下来的apk文件使用工具软件反编译
c.打开反编译的文件夹,找到res/xml目录,查找network_security_config.xml文件
d.如果没有就自己新建一个,使用UTF-8无BOM的编码,内容为:
7.判断代理是否设置成功
打开fiddler-打开任意一个应用-查看fiddler中是否有请求
三.客户端请求
抓包本质上是查看客户端与服务器之间交互的过程和结果
1.请求方式:常用的有get请求与post请求
两者之间的区别
2.url组成
url组成:协议+域名+端口+虚拟目录+文件名+参数+锚
{协议}://:{端口号}/{路径}/{文件}?{参数}#{锚}
示例A https://app.bilibili.com/x/v2/splash?access_key=5bb8b7647b960b2506d1c55f40e6b1b5&actionKey=appkey&appkey=27eb53fc9058f8c3&build=6633&channel=appstore&device=phone&height=2208&mobi_app=iphone&platform=ios&sign=380eaeb889dbf4f1e1a9c1d59a4854f0&ts=1523966281&ver=41439258780710287502018250&width=1242
常用协议:http、https (示例中为: https:)
域名:app.bilibili.com是域名,可使用ip地址作为域名
端口:跟在域名之后的是端口,域名与端口之间由“:”分开(非必须,省略则使用默认端口)(示例中省略)
虚拟目录:从域名后的第一个“/”开始到最后一个“/”为止(非必须)(示例中为:/x/v2/)
文件名:从域名后的最后一个“/”开始到“?”为止(非必须,省略则使用默认文件名)(示例中为:splash)
参数:从“?”开始到“#”为止之间的部分(可有多个参数,参数与参数之间用“&”拼接)(示例中为:?后所有内容)
锚:从“#”开始到最后,都是锚部分(非必须)(示例中无)
3.常用的协议:http/https
也可参考文章:https://www.zhihu.com/question/19577317
四、fiddler界面
(1)Static:可以清晰的看到客户端请求发出的时间、请求耗时、请求资源的大小
(2)Inspector:常用来定位问题
inspectors tab下有很多查看request或者response的消息。
raw tab可以查看完整的消息
headers tab只查看消息中的header
WebForms tab以直观的界面查看Body值和QueryString值
Cookies tab以直观的界面查看header中的cookie值
定位问题举例:
客户端有一个视频的封面没有展示,但是我们通过接口可以看到接口其实是有返回对应的图片(“cover”字段后有对应的图片)
问:这是谁的锅?
思路:
1.这个图片服务端有返回的,客户端没有展示出来,是不是客户端的问题?
2.我可以通过浏览器去查看这个图片,看下它到底可不可以正常打开?
3.这个图片的格式是不是客户端不支持啊
(3)AutoResponder:重定向
字面意思:重新设定方向 正常:a->b 改变:a->c
通俗理解:请求一个接口把服务端返回值改成你自己希望的返回值,通过配置对应的服务端返回文件来实现
目的:不通过修改数据库或其它方式,短时间内完成测试场景的覆盖
示例:
caseA:视频没有封面时,如何展示
思路:
1.确定是哪个接口
2.确定接口返回的数据,哪个字段对应封面
3.修改返回的数据
方式:
1.在fiddler请求列表中找到对应url--点击选中
2.切换AutoResponder tab--点击add Rule
3.在底部 Rule Editor中--点击"test..."--将url“?”后部分全部删除--将前方的“exact:”改为“regex:”-save changes
原因:由于每次请求时的参数都有变更 regex:正则匹配 exact:完全匹配(可能导致下次本次修改不生效)
本步目的:确定你想要修改哪个请求的返回
4.先查看此请求正常的返回值(切换insepectors tab-查看底部response)
5.复制返回文件到一个新的文件中
实现步骤:
a.查看底部response-切换textviewtab
b.点击数据区域-ctrl+a全选并复制
c.新建一个文件--将文件复制到新文件中
备注:新文件的格式要与接口返回数据格式一致(常见有xml、json等)
d.找到文件对应字段,修改字段值(此处将cover的值置为空)
6.点击 Rule Editor第2个下拉菜单--下拉--点击find a file--选择新文件的保存路径
7.点击save & ensure rules 下次再次请求此接口就会生效
(4)Filters
设置会话过滤
以移动端测试为例,fiddler会监听手机发出的所有http请求,列表中请求过多,不容易查找所需的请求,此时可以设置过滤
首先要确定:我只需要查看的APP发出的哪些http请求
举例:
一个APP发出的请求有app.baidu.com api.baidu.com message.baidu.com.....
此时可以使用 通配符+其他模糊匹配域名 如:此处可使用 *.baidu.com
其他固定的域名就直接写上,注意:域名与域名之间用“;”分隔
在fiddler上的操作
1.切换Filters tab-在Hosts区域操作
2.第一个下拉菜单选择“No Zone Filter”--第二个下拉菜单选择“Show only the following Hosts”
第二个下拉菜单中的内容:
No Host filter:不设置域名过滤
Hide the following hosts:隐藏下方域名
show only the following hosts:仅展示下方的域名
flag the following hosts:标记下方域名(fiddler4是黑色加粗显示域名)
3.勾选左上角“use filters”(判断过滤是否生效(filters tab显示绿色对勾))
(5)fiddler工具栏
(6)设置断点修改request
修改请求参数
方法1:打开fiddler 点击rules-> automatic breakpoint ->before requests(不长使用,无针对性)
备注:此操作之后,后续所有的请求均会被中断
取消断点:打开fiddler点击rules-> automatic breakpoint ->disabled
方法2:在(5)中命令行工具栏输入 bpu+指定url 然后输入回车
仅可拦截指定url请求
取消断点:仅输入bpu 然后输入回车
(7)显示ip地址
默认fiddler是不显示此列
应用场景:测试过程中经常会切换环境(测试环境、UAT、预发....),可以根据server ip确认环境是否生效
方法:
1.Ctrl+r打开fiddler scripteditor
2.Crtl+f搜索输入static function Main()
3.在如下位置加入一段代码:
FiddlerObject.UI.lvSessions.AddBoundColumn("ServerIP", 120, "X-HostIP");
4.保存
5.重新打开fiddler 可看到severip行
(8)模拟弱网
一、fiddler自带(不是特别好用,贵在精确)
备注:在原有响应时间的基础上增加时长
方法:
1.Ctrl+r打开fiddler scripteditor
2.Crtl+f搜索输入simulate 找到如下代码:
二、使用iPhone自身的开发者选项
如何出现开发者选项?(以xcode9为例)
1.手机设备连接macxcode
2.Xcode -> Windows->Device and Simulators
3.选择当前设备->右键弹出选择菜单->选择Show Provisioning Profiles
4.拔掉数据线,打开设置可以看到“开发者”选项
模拟网络
1.开发者->NETWORKING->Network Link Conditioner
2.profiles常用列表项说明
100%Loss 全丢包
3G 3G网络
DSL 电话线上网
Edge 2G网络
High Latency DNS高延迟
Very Bad Network 网络状况不稳定
Wifi Wifi网络
3.选择对应的网络状态-Enable开关打开(绿色)
4.此时手机的网络速度就被改变了
备注:
个人偏爱:Edge/Very Bad Network 当弱网使用
3G:网络相对正常
wifi:相对较好的网络环境(跟wifi本身相关)
不模拟网络环境时,一定要记得把Enable开关关闭!!!否则忘了会很尴尬