多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

17727591462

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

如何记录Selenium自动化测试过程中接口的调用信息

更新时间:2022-04-18 09:27:05 作者:多测师 浏览:116

  如何记录在测试过程中接口的调用情况?提出这个需求,我觉得是有意义的。你在测试过程中肯定会遇到一些莫名其妙的问题,比如:web某个页面一直在刷进度条,导致你定位元素失败,但是,你再手动操作一遍可能无法复现....对于我们来说,肯定会遇到许多类似的问题。你会发现有时候仅仅靠一张截图,你远远找不到bug的原因。这时候,我在想如果我能拿到这一系列操作所调用的接口信息多好,我就能明白为什么发生这种问题了。比如一直在刷进度条我觉得有几种情况:1.后端一直在等待某个接口的响应信息。2.网络原因导致,接口响应很慢(局域网一般很少出现这类问题)、3.前端工程师没有动态的把这个进度条display="None"....不论何种原因,我拿到相关的接口信息,就能对错误逐个排除。比如我发现某个接口的响应时间很长.....或者所有接口的响应的时间多是大于1s的,又或者都正常响应,原来js没有动态改变进度的属性?反正无论如何我拿到自动化操作的接口信息是没有坏处的吧?(小小的缺点我后面提到)

如何记录Selenium自动化测试过程中接口的调用信息

  那么问题是,我们如何精准的拿到这些信息?我开始的想法是通过firebug去拿,firebug我们平时用的也比较多,可以方便的看到控制台信息(js的执行情况)和网络信息(接口调用情况),但是我查了很多资料都没有办法完整的把这些信息给导出来....但是,我很快的想到了Fiddler。Fiddler是目前为止我用的最好最顺手的一款http抓包工具(不要和我提什么wireshark,虽然经过网卡的信息它都能抓但是仅对http协议来说,真不如fiddler牛逼,谁用谁知道),更重要的是由于它是个代理服务器,所以能抓任何设置其为代理的终端,包括手机...想到这,心中一阵窃喜。下面我先说说思路,然后再详细的说明,我是怎么做的。我的思路如下:

  1.设置fiddler过滤一下抓取信息,如:只抓取host为:*.csdn.net的接口信息。

  2.测试执行开始前,打开fiddler。

  3.当执行一个test时,先在fiddler控制台输入cls,清空当前sessions,防止接口信息过多或混在一起不方便排查错误。

  4.当执行test完毕,如果有错误,则保存此test执行过程中的所有sessions至一个文件夹。无错误不做操作(如果你非要保存也是可以的)

  5.重复2-3的步骤,直至所有测试结束。

  6.测试执行结束后,关闭fiddler。

  上面的想法,其实也是很简单的,我们再一个个看看如何实现:

  对于步骤1/2/5 用python调用控制台打开fiddler是有问题的(主进程会阻塞,其他应用程序没问题),改用AutoIt的run方法,关闭没问题。

  对于3/4是要想想办法的。对于自动化人员来说AutoIt您应该是接触过了,如果没有就去看看吧!AutoIt有弊端有优点,最大的优点就是编写简单、脚本能转换成exe.最大的缺点:windows非标准控件无法获取。万幸的是Fiddler的控制台输入框能被AutoIt识别!还有就是如何改写Fiddler的Scripts。(我们的需求很简单,别被吓到了)

  所以第一步:我们编写清除fiddler session的脚本,转换成C_interface.exe。脚本简单到不能简单了,如下:

  Example()

  Func Example()

  Local $hWnd = WinWait("[Title:Telerik Fiddler Web Debugger]", "", 10)

  WinActivate($hWnd);激活当前窗口

  ControlFocus($hWnd, "","[CLASS:WindowsForms10.EDIT.app.0.141b42a_r6_ad1;NAME:txtExec]")

  ControlSetText($hWnd, "", "[CLASS:WindowsForms10.EDIT.app.0.141b42a_r6_ad1;NAME:txtExec]","cls")

  Send("{ENTER}")

  EndFunc ;

  照顾一下,刚开始看AutoIt的同学,Title中的Telerik Fiddler Web Debugger与ControlFocus中的CLASS、NAME是通过AutoIt Window info这个工具捕捉的

  我们写完了了清除session后,再来写下保存接口信息的脚本,也很简单保存为D_interface.exe:

  Example()

  Func Example()

  Local $parment=$CmdLine[1];接受控制台数据,$parment为fiddler接口保存路径

  Local $hWnd = WinWait("[Title:Telerik Fiddler Web Debugger]", "", 10)

  WinActivate($hWnd);激活当前窗口

  ControlFocus($hWnd, "","[CLASS:WindowsForms10.EDIT.app.0.141b42a_r6_ad1;NAME:txtExec]")

  ControlSetText($hWnd, "", "[CLASS:WindowsForms10.EDIT.app.0.141b42a_r6_ad1;NAME:txtExec]","dump "&$parment)

  Send("{ENTER}")

  IF WinActive("[Title:Cannot Save SAZ]") Then

  ControlClick("[Title:Cannot Save SAZ]","","Button1")

  EndIf

  EndFunc ;

  标红部分的解释是:当Fiddler没有session时(虽然不太可能出现这种情况),执行dump命令会弹出个对话框,这时候要关闭对话框!!如果不关闭的话下面对fiddler的操作会出现问题,因为这时候弹出框是fiddler的顶级窗口,可能导致脚本中使用Enter键无效...

  其次,由于python调用控制台启动Fiddler有问题(具体问题原因未知),所以我们也用AutoIt编写,并转换成S_interface.exe:

  Example()

  Func Example()

  Local $parment=$CmdLine[1]

  Run($parment)

  EndFunc ;

  最后,我们改下Fiddler的Script的,从菜单的Rules->Customer Rules打开脚本剪辑器,直接拉到script的末端修改方法OnExecAction如下:

  ......

  case "dump":

  UI.actSelectAll();

  var bpMethod = sParams[1]

  //UI.actSaveSessionsToZip(CONFIG.GetPath("Captures") + "dump.saz");

  UI.actSaveSessionsToZip(bpMethod)

  FiddlerObject.StatusText = "Dumped all sessions to " +bpMethod;

  //FiddlerObject.alert(bpMethod);

  UI.actRemoveAllSessions();

  return true;

  修改case 'dump'的情况,bpMethod是由命令bump空格后的参数。对应于上文我们AutoIt脚本中的$parment参数(由控制台输入)。

  上面我们的准备工作的做的差不多了,总结一下,干了下面的几个事情:

  1.用AutoIt生成了清除Fiddler session的一个exe

  2.用AutoIt生成了保存Fiddler session的一个exe

  3.修改了Fiddler的Script接受一个保存session路径的一个参数

  在完成了以上工作后,我们来进行测试!注意:在此之前我们要明白一些事情:

  1.用Fiddler做代理后,可能影响接口的加载速度,毕竟有个第三者。但是我觉得速度影响在web自动化上不是那么重要的事情,毕竟现实中的访问速度肯定比你公司内部访问速度更差。(缺点之一)

  2.用Fiddler做代理后,我们知道在访问https的时候比如访问百度,可能显示非安全链接,我们平常的做法是把fiddler的证书导入浏览器(具体百度上有说明),但是我们webdriver启动的是个空白的浏览器,如何能自动加载Fiddler证书?

  3.用Fiddler做代理后,如果Fiddler崩溃或者没启动起来造成无法联网导致所有脚本无法运行,这个风险我们如何规避?

  第一个问题跳过,我们看看第二个问题:

  在路径C:\Python27\Lib\site-packages\selenium\webdriver\firefox\firefox_profile.py下定义了一个FirefoxProfile类,这个类我们平时可能不太用的上,但是用不上不代表他不重要,这个类是个管理浏览器插件的类。我们说明一下:

  1.其构造函数传火狐浏览器的插件路径。火狐浏览器的插件一般在C:\Users\***\AppData\Roaming\Mozilla\Firefox\Profiles\****.default-*****"这个路径下面。构造函数会把这个路径下的东西copy到c:\\users\\pf-211x3\\appdata\\local\\temp\\***\\webdriver-py-profilecopy这个文件夹下。

  2.encoded函数。这个函数的文档属性这样解释:"A zipped, base64 encoded string of profile directory for use with remote WebDriver JSON wire protocol"具体很么意思呢?就是这个函数会把上文中我们提到的c:\\users\\pf-211x3\\appdata\\local\\temp\\***\\webdriver-py-profilecopy这个文件夹压缩成ZIP格式文件,然后对这个文件进行base64的编码,当启动浏览器的时候,会将这个编码一同发给服务器,服务器再对他base64解码、解压缩将您本地火狐插件完完整整的复制到新启动的空白浏览器上,那么我们新启动的浏览器就拥有了本地浏览器所有的插件了。

  3.set_preference。传递一个键值对,就是设置火狐浏览器的选项,比如设置代理等等....

  4.add_extension。传递一个***.xpi的路径,就是设置浏览器加载的插件,比如启动浏览器加载firebug,把firebug插件路径传递给add_extension即可

  经过我对FirefoxProfile类的说明,您大概知道了问题二的解决办法了吧,对的就是向FirefoxProfile类中传递插件的路径。但是C:\Users\***\AppData\Roaming\Mozilla\Firefox\Profiles\****.default-*****"这个文件是比较大的反正我的是50M,将这样一个大的文件经过步骤2的操作,是个费事费力的事情。所以你们会发现,如果把完整的插件路径传递给FirefoxProfile,经过一系列的压缩、传递,启动本地浏览器会非常非常慢!经过排除和尝试法,我发现火狐对证书的控制是由插件文件夹下的cert8.db控制的,所有我们把这个文件给拷贝出来放在一个文件夹中,单独传这个文件夹路径即可。

  以上内容为大家介绍了如何记录Selenium自动化测试过程中接口的调用信息,本文由多测师亲自撰写,希望对大家有所帮助。了解更多自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部