selenium自动化测试过程中接口的调用信息

news2024/11/15 14:09:24

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

那么问题是,我们如何精准的拿到这些信息?我开始的想法是通过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。脚本简单到不能简单了,如下:

1

2

3

4

5

6

7

8

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:

1

2

3

4

5

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控制的,所有我们把这个文件给拷贝出来放在一个文件夹中,单独传这个文件夹路径即可。

第三个问题:

浏览器的代理有几下几种:1.不使用代理。2.自动检测此网络的代理设置。3.使用系统代理。4.手动配置代理。5,自动代理配置

对于1和4大家都明白;对于5也还好就是:写一个脚本告诉浏览器什么样的域名我要代理,其他的不使用代理(具体百度);对于2和3我多少有点不知道他怎么用,对于3使用系统代理我的实践就是如果我启动了fiddler它就使用了fiddler代理,如果没有启动就不使用代理,看起来挺智能了。我也不太清楚这样为什么...所以对于问题三我也是纠结的:第一、如果设置手动代理看起来是没问题的,就怕fiddler故障了,然后雪崩...第二、我着实不太了解我使用系统代理对不对?这个大家自己看好了。我反正就用系统代理了,至少能满足我的想法:万一fiddler故障了也没啥,大不了就抓不到接口数据呗,其他的还能正常的跑....

最后,就是在我们上篇继承unnitest的run方法里面,修改一点点代码,也很简单(红色标识了):


......
def run(self, result=None):
        orig_result = result
        if result is None:
            result = self.defaultTestResult()
            startTestRun = getattr(result, 'startTestRun', None)
            if startTestRun is not None:
                startTestRun()
        self._resultForDoCleanups = result
        screenshot_path=getattr(result,"screenshot_path",False)
        dir_name = os.path.dirname(__file__) # 当前脚本根目录
        #因为fiddler保存尽量要使用绝对路径,如果使用相对路径会保存到安装目录下,这是我们不希望的
        sessiong_path = dir_name + "/" + "Error_session"#默认session保存路径
        if not screenshot_path:
            screenshot_path=self.__screenshot_path
        else:
            if os.path.dirname(screenshot_path):#如果是绝对路径
                sessiong_path=os.path.dirname(screenshot_path)+"/Error_session"#拿到运行test的根目录+FiddlerSessions
        result.startTest(self)
        testMethod = getattr(self, self._testMethodName)
        if (getattr(self.__class__, "__unittest_skip__", False) or
                getattr(testMethod, "__unittest_skip__", False)):
            # If the class or method was skipped.
            try:
                skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
                            or getattr(testMethod, '__unittest_skip_why__', ''))
                self._addSkip(result, skip_why)
            finally:
                result.stopTest(self)
            return
        try:
            success = False
            try:
                self.setUp()
            except SkipTest as e:
                self._addSkip(result, str(e))
            except KeyboardInterrupt:
                raise
            except:
                result.addError(self, sys.exc_info())#启动setUp失败直接判断出错
            else:
                try:
                    testMethod()
                except KeyboardInterrupt:
                    raise
                except (self.failureException,exceptions.WebDriverException):#如果是断言错误或WebDriverException,类型为fail,且增加截图
                    #增加截图
                    browser=self.getbrowser()#尝试拿浏览器实例
                    if browser:
                        filename=self.__class__.__name__+"_"+self._testMethodName+".png"#格式:类名+方面名称
                        browser.get_screenshot_as_file(screenshot_path+"\\"+filename)
                        reback_filename=filename
                    else:
                        reback_filename=None
                    #保存sessions数据
                    sessionfile_name=self.__class__.__name__+"_"+self._testMethodName+"_err.saz"#注意格式是saz
                    os.popen(dir_name+"/"+"Tools/D_interface.exe "+sessiong_path+"\\"+sessionfile_name)#控制台运行D_interface.exe由AutoIt生成,保存出错的session
                    result.addFailure(self, sys.exc_info(),reback_filename)#回传截图名称给report,以便能显示在报告中
                except SkipTest as e:#如果为跳过的异常,类型为Skip异常
......

最后我的demo文档结构大概是这样的:


其中Error_session是保存错误的session;FireFox_profile是我们说到的火狐证书插件;Tools是我们转换的3个简单的exe程序;screen_shot存放错误截图;IqunxingTest.py是我们改写的unnitest类,我们新建测试demo脚本:


#coding=utf-8
import IqunxingTest
import HTMLTestRunner
import sys,os
import unittest
from  selenium import webdriver
from  selenium.webdriver.firefox import firefox_profile
import time
dir_name = os.path.dirname(__file__)  # 拿到根目录
class Mydemo(IqunxingTest.IqunxingTest):
    u'''测试CSDN登录'''
    @classmethod
    def setUpClass(cls):
        profile=firefox_profile.FirefoxProfile(profile_directory=dir_name+"/FireFox_profile")
        profile.set_preference("network.proxy.type", 5)#将浏览器代理设置为系统代理
        cls.browser=webdriver.Firefox(firefox_profile=profile)#启动带插件的浏览器
        cls.browser.implicitly_wait(10)
    @unittest.Myskip
    def test1(self):
        u'''打开csdn'''
        browser=self.browser
        browser.get("http://www.csdn.net/")
    @unittest.Myskip
    def test2(self):
        u'''csdn登录'''
        os.popen(dir_name+"/"+"Tools/C_interface.exe")#在test开始前,清空Fiddler session信息
        browser = self.browser
        browser.find_element_by_link_text(u"登录").click()
        time.sleep(1)
        browser.find_element_by_id("username").send_keys("test")
        time.sleep(1)
        browser.find_element_by_id("password").send_keys("test")
        time.sleep(1)
        browser.find_element_by_class_name("logging").click()#点击登录
        if not browser.find_element_by_class_name("phr_first").is_displayed():#如果没有登录成功是找不到这个控件会报错
            self.assertTrue(False,"login failed")
if __name__ == '__main__':
    fiddler_path = "C:\Program Files (x86)\Fiddler2\Fiddler.exe"#您的Fiddler路径
    s = os.popen(dir_name + "/Tools/S_interface.exe " + "\"" + fiddler_path + "\"")#启动Fidder
    module_name=os.path.basename(sys.argv[0]).split(".")[0]
    module=__import__(module_name)
    runner=HTMLTestRunner.HTMLTestRunner("reprot.html")
    all_suite=unittest.defaultTestLoader.loadTestsFromModule(module)
    runner.run(all_suite)
    os.popen('''taskkill /f /im "Fiddler.exe"''')#测试完成后关闭fiddler

因为我们要找一些有用的sesssion信息,可喜的是Fiddler能过滤一些你设置完的信息,我的过滤信息如下:

因为测试CSDN,所以我只展示域名为*.csdn.net的会话;另外,一些css,js,png等无用信息我也隐藏了(正则表达式隐藏)。好了万事具备,我们运行下这个demo:最后在Error_session下保存了我们test2操作的所有http信息文件名为:Mydemo_test2_err.saz(过滤的除外),同时在screen_shot下保存错误的截图。我们直接用fiddler打开这个saz文件:

从上面的截图可以看出来,我们保存的session是完整的(过滤的除外)。而且我们看到了我们点击登录时,使用的接口以及传递的相关信息。当然,我们点击Fiddler其他标签事能获取一切我们想获取的信息。

【整整200集】超超超详细的Python接口自动化测试进阶教程合集,真实模拟企业项目实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/985672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kubernetes 之 minikube折腾记

参考官网教程,链接: https://minikube.sigs.k8s.io/docs/start/ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube安装完启动minikube:…

超高真空度精密控制解决方案设计中百度“文心一言”的具体应用

摘要:本文采用国产版本ChatGPT百度“文心一言”作为一种辅助工具,针对超高真空度精密控制装置的开发进行了初期的技术路线设计,对话调研的重点是了解可调节式微流量进气阀门和可用于连接非线性输出信号型真空计的PID控制器。总体而言&#xf…

【容器vs虚拟机】

容器vs虚拟机 为什么用虚拟机什么是容器容器vs虚拟机 Docker被称为是轻量级的虚拟化。 首先,一般开发所需要的都是Linux环境,但我们大多数人的电脑都是Windows系统。所以要安装虚拟机,目的是为了在我们当前所使用的Windows上面安装上Linux环境…

韶音耳机是哪个国家的品牌,韶音骨传导耳机值得入手吗

有很多小伙伴们在后台私信我,问我韶音耳机是哪个国家的品牌,以及韶音骨传导耳机值不值得入手等问题,其实韶音在国内的影响力也可以说是挺高的,下面我将针对这几个问题来给大家解析一下。 韶音耳机是哪个国家的品牌? 韶…

05-JVM内存分配机制深度剖析

上一篇:04-JVM对象创建深度剖析 1.对象栈上分配 我们通过JVM内存分配可以知道JAVA中的对象都是在堆上进行分配,当对象没有被引用的时候,需要依靠GC进行回收内存,如果对象数量较多的时候,会给GC带来较大压力&#xff…

经典神经网络介绍-面试必备(持续更新...

一、RCNN系列 1、RCNN RCNN是用于目标检测的经典方法,其核心思想是将目标检测任务分解为两个主要步骤:候选区域生成和目标分类。 候选区域生成:RCNN的第一步是生成可能包含目标的候选区域,RCNN使用传统的计算机视觉技术&#x…

【Apollo学习笔记】——规划模块TASK之PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER(一)

文章目录 TASK系列解析文章前言PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER功能介绍PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER相关配置PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER流程确定优化变量定义目标函数定义约束ProcessSetUpStatesAndBoundsOptimizeByQPCheckSpeedLimitF…

六种线程状态转换大汇总

五种线程状态 or 六种线程状态 五种状态这是从 操作系统 层面来描述的 六种状态这是从 Java API 层面来描述的 六种线程状态转换 假设有线程 Thread t 情况 1 NEW --> RUNNABLE 当调用 t.start() 方法时&#xff0c;由 NEW --> RUNNABLE 情况 2 RUNNABLE <-->…

达梦数据库-锁表

查询锁表语句 select * from v$sessions where trx_id in (select trx_id from V$LOCK) and user_name 用户名称 order by create_time desc;关闭会话 sp_close_session(上面语句查询到的sess_id);

【LangChain系列 4】Model I/O——Prompts概述

原文地址&#xff1a;【LangChain系列 4】Model I/O——Prompts概述 本文速读&#xff1a; Prompt模版 样本选择器 Prompts简单来讲就是一组指令或文本输入&#xff0c;语言模型理解它的意思后&#xff0c;给出一个输出响应。 LangChain提供了一些模块可以让我们更方便地使…

【机器视觉】揭秘机器视觉在锂电池生产中的应用

随着环保意识的日益增强和新能源汽车市场的快速发展&#xff0c;新能源锂电池的需求量也在不断攀升。而在锂电池生产的全过程中&#xff0c;机器视觉技术正发挥着越来越重要的作用。那么&#xff0c;机器视觉到底能在哪些环节大显身手呢?本文将带您揭秘机器视觉在锂电池生产中…

2023 年全国大学生数学建模D题目-圈养湖羊的空间利用率

D题目应该是专科题目&#xff1f;&#xff1f;&#xff1f;不确定了 感觉类似一个细胞分裂问题一样&#xff0c;1&#xff0c;2&#xff0c;4&#xff0c;8&#xff0c; 题目1中规中矩 按照前面说的分配方法&#xff0c;一步一步计算进行 缺口的问题考虑反推回去&#xff0c…

最强的AI视频去码图片修复模型:CodeFormer

目录 1 CodeFormer介绍 1.1 CodeFormer解决的问题 1.2 人脸复原的挑战 1.3 方法动机 1.4 模型实现 1.5 实验结果 2 CodeFormer部署与运行 2.1 conda环境安装 2.2 运行环境构建 2.3 模型下载 2.4 运行 2.4.1 人脸复原 ​编辑​编辑 2.4.2 全图片增强 2.4.3 人脸颜色…

小程序 target 与 currentTarget(详细)

小程序中关于事件对象 e 的属性中有两个特别重要的属性:target与currentTarget属性:对于这两个属性,官方文档上的解释是: target:事件源组件对象currentTarget:当前组件对象由于官方解释太过精炼,下面仔细讲讲其中的含义,先看一段代码: <view id="outter&quo…

自动提词器有哪些?这几款收藏好

自动提词器有哪些&#xff1f;自动提词器是一种非常实用的工具&#xff0c;无论是在翻译还是整理工作中&#xff0c;都可以帮助我们快速、准确地完成各种繁琐的任务。市面上有很多种自动提词器的应用&#xff0c;那么今天就来给大家介绍几款好用的自动提词工具。 【书单视频助手…

nowcoder NC10 大数乘法

题目链接&#xff1a; https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId196&tqId37177&rp1&ru/exam/company&qru/exam/company&sourceUrl%2Fexam%2Fcompany&difficultyundefined&judgeStatusundefined&tags&tit…

解决VSCode下载速度特别慢的问题

一、下载VSCode 1.打开VSCode官网 https://code.visualstudio.com 2.download下载 3.下载特别慢 二、解决VSCode下载速度特别慢 1.单击右下角全部显示 我是用chrome浏览器&#xff0c;点击右下角的全部显示按钮&#xff0c;可以跳转到下载内容页面。 如果你是用其他浏览器…

OpenCV(二十八):连通域分割

目录 1.介绍连通域分割 2.像素领域介绍 3.两遍法分割连通域 4.连通域分割函数 1.介绍连通域分割 连通域分割是一种图像处理技术&#xff0c;用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性&#xff0c;如相近的灰度值或颜色。连通域分割可以…

(十一)人工智能应用--深度学习原理与实战--实现泰坦尼克号生存者预测案例Titanic Survival

泰坦尼克号生存者预测(Titanic Survival)是谷歌Kaggle人工智能大赛中的经典亲例。本任务要求根据给定的1300余位乘客的特征(姓名、性别、年龄、舱位等】及幸存情况(0-死亡,1-幸存】建立神经网络模型,能够较巿准确地预测测试集中乘客的幸存情况。 主要流程为: 数据的导人及预…

Json“牵手”当当网商品详情数据方法,当当商品详情API接口,当当API申请指南

当当网是知名的综合性网上购物商城&#xff0c;由国内著名出版机构科文公司、美国老虎基金、美国IDG集团、卢森堡剑桥集团、亚洲创业投资基金&#xff08;原名软银中国创业基金&#xff09;共同投资成立1。 当当网从1999年11月正式开通&#xff0c;已从早期的网上卖书拓展到网…