在使用fiddler的一些功能中,很少会使用到FiddlerScript这个功能。但经过研究后,发现这个功能实在是强大,不敢说它能实现目前fiddler的全部功能,但是大致过了一遍,主要功能都可以通过它来进行扩展 。那么问题来了,既然fiddler已经提供了很完善丰富的功能,那么我们为什么还会用使用这个功能呢?这就像问使用工具和代码的区别,使用工具简单易用,但不易扩展;反之,使用代码扩展性强,更能满足我们的需求,但是学习成本高。
功能入口
在fiddler中有两个入口都可以进入到FiddlerScript中,具体如下:
打开的文件其实是FiddlerScript的Rules文件,通过修改此文件,可以创建一些菜单命令,也可以修改或添加新命令 。
此文件的原始文件名为SampleRules.js,位于...ProgramsFiddlerScripts文件夹下,当我们打开FiddlerScript编辑其内容时,它将在...DocumentsFiddler2Scripts文件夹下创建一个名为CustomRules.js的文件。也就是说我们修改的文件并非是源文件,而是它拷贝出的一个副本。运行时也是这个副本文件(CustomRules.js)
功能介绍
打开的文件,其实就是一个Handlers类,这个类中有很多方法,但主要使用的内容包括四部分,分别是菜单命令以及三个主要方法(OnBeforeRequest,OnBeforeResponse,OnExecAction)。
1.菜单命令
菜单命令其实就是指在Rules下拉列表中的一些选项,这些选项和代码中是一一对应的,通过修改代码,也会影响菜单的显示。
这些菜单选项中最为常用的就是Performance-Simulate Modem Speeds,通过它进行限速处理,从而进行弱网测试,网络不稳定的测试。
设置弱网
选择Rules-Performance-Simulate Modem Speeds后,下面的这部分代码将被执行到,我们可以通过修改其后的值来模拟网络带宽。
if (m_SimulateModem) { //每延迟300ms发送1kb的数据,也就是每1s发送3kb的数据 oSession["request-trickle-delay"] = "300"; // 每延迟150ms下载1kb的数据 oSession["response-trickle-delay"] = "150"; }
为了更真实的模拟网络情况,我们也可以将后面的值设置成动态值。每发送一次数据就获取一个动态值,从而模拟网络抖动的情况,这样就可以进行网络不稳定的模拟测试 。
//模拟网络抖动static function randInt(min, max) { return Math.round(Math.random()*(max-min)+min); }static function OnBeforeRequest(oSession: Session) { ... if (m_SimulateModem) { oSession["request-trickle-delay"] = ""+randInt(1,300); oSession["response-trickle-delay"] = ""+randInt(1,150); }}
自定义菜单
若我们想加一个自定义的选项,来实现我们的功能。
那么你可以在此选项自定义你的功能,我这里就以打印Hello Fiddler为例,当选择Test选项时,你在日志中就会看到有Hello Fiddler输出。
//把这段代码放在OnBeforeRequest函数中。if(m_Test){ //实现你的需求,我这里就打印出"hello fiddler" FiddlerObject.log("Hello Fiddler");}
可以想象一下,如果我在这里定义的功能是实现输出每个请求的自定义请求和响应数据,类似于fiddler的Inspectors功能,是不是很酷啊。
2.OnBeforeRequest
这个函数中实现的是请求数据,通过修改代码,就可以实现包括请求url,请求方法,请求头,请求体的数据进行新增、修改、删除、显示等。
请求着色
为了快速查找我们关注的请求,我们经常会给请求标注某种颜色来加以区分,那么接下来就通过修改代码给每个请求着色。
比如我们想要给url中含有html的请求加红色,你只需要在OnBeforeRequest函数的开头加入这么一句代码后保存,后续符合条件的请求就都会变为红色
if (oSession.uriContains(".html")) {oSession["ui-color"] = "red";}
当然你喜欢其它的颜色,你只需把后面的red修改为其它的值就可以了 。具体支持那些值呢?看下图
自定义请求数据
若我们要通过自定义方式查看请求数据,就可以是在OnBeforeRequest函数中加个判断,然后将我们关注的请求数据输出 。这就类似于Inspectors的查看请求功能。
案例:将url中包含demo.zentao.net的请求输出其url,method,headers,body等信息。
实现思路:在OnBeforeRequest中加入url中包含demo.zentao.net的判断,在判断中编写输出信息代码,保存脚本后 。
if(oSession.uriContains("demo.zentao.net")){ FiddlerObject.log("请求url:"+oSession.fullUrl); FiddlerObject.log("请求方法:"+oSession.RequestMethod); FiddlerObject.log("请求头:"+oSession.RequestHeaders) FiddlerObject.log("请求体数据:"+oSession.GetRequestBodyAsString()); FiddlerObject.log("===============================================");}
然后在日志就可以看到输出信息,具体如下:
修改请求数据
在前面我们学习过,通过断点可以修改请求数据,那么通过此函数也可以来实现请求数据的修改 。
案例:登录禅道的正确账号demo,那么我通过修改其账号让其登录失败 。
实现思路:获取到禅道登录页面的请求体数据后,将登录账号demo替换为其它(如test),保存脚本。
if(oSession.uriContains("https://demo.zentao.net/user-login.html")){ //将请求中的demo替换为test oSession.utilReplaceInRequest("demo","test");}
替换后,进入到Inspectors中查看输入账号的地方,发现账号已被替换为test了 。且禅道的登录页面也返回了登录失败的提示。
3.OnBeforeResponse
这个函数实现的是响应数据,你可以在该函数对状态行、响应头以及响应体中的数据进行新增,修改,删除及查询等。
自定义响应数据
若我们只想查看所关注请求的响应数据,那么就可以在OnBeforeResponse加个判断,然后我们把关注的信息数据输出即可。
案例:将url中包含demo.zentao.net的响应输出其响应状态码和响应体信息。
实现思路:在OnBeforeResponse中加入一个判断url包含demo.zentao.net,然后判断实现输出状态码和响应体的输出信息,保存脚本 。
if(oSession.uriContains("demo.zentao.net")){ FiddlerObject.log("响应状态码:"+oSession.responseCode); FiddlerObject.log("响应体数据:"+oSession.GetResponseBodyAsString());}
同样的进入日志模块就会看到响应数据的输出日志 。
修改响应数据
同样我们也可以对返回的数据进行修改或者自定义返回数据。
案例:禅道登录成功后,默认跳转到了首页,现将修改其跳转到‘测试’标签页 。
实现思路:禅道登录后,返回的响应体数据是个json数据:{"result":"success","locate":"index"},其locate对应的值就是控制跳转到那个页面,现可以将此值修改为qa就会自动跳转到测试标签页。
if(oSession.uriContains("https://demo.zentao.net/user-login.html")){ FiddlerObject.log("修改后的响应体数据:"+oSession.utilReplaceInResponse('index','qa'));}
替换后,进入到Inspectors中查看响应体数据,发现index已经替换为qa了 。且登录后的页面也跳转到了测试页面。
4.OnExecAction
此函数已在QuickExec中做过详细的介绍,这里不再展开。
实现更多扩展
以上介绍了FiddlerScript中最基本常用的一些功能扩展,那如果你需要开发一个更加复杂且要符合你项目的定制功能,那么你就离不开它提供的函数,只有对这些函数非常的熟悉和了解,我们才能更好的应用它。点击ClassView就可以看到
展开它的任何一个类,下面都有很多的属性和方法,其作用从其命名上也能猜出其大致含义,或者点击任一个方法或属性,在上面都会展示出其功能说明 ,然后我们放在上面的两个方法中去试,你就能定制针对fiddler个人功能了。
综上所述,通过FiddlerScript功能,我们可以设置过滤,设置弱网,请求着色,自定义菜单,自定义查看的请求和响应数据,修改请求数据,修改和自定义返回数据 。同样它也支持导出/导入请求 。
写在最后,小编致力于将服务器及接口测试所使用到的常用工具和代码整理为更加全面、简单易懂且实用性强的教程,
整理的教程中包括但不限于:postman,fiddler,jmeter,git,jenkins,docker,k8s,python,unittest,pytest,接口自动化,性能测试,devops,charles等.
有感兴趣的小伙伴可以加个关注,谢谢。