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其他标签事能获取一切我们想获取的信息。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
文档获取方式:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-tDOMKhtK-1713078399944)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!