selenium,实现ECShop后台登录模块测试代码(2)
一、实现ECShop后台登录模块测试代码 1.已经实现了基本操作步骤,现在要实现检查的代码 (1)第一种检查:测试用例文档中预期结果编号是1的情况,需要检查登录ECShop后台成功,如何检查? a.最初:检查“退出”这个元素出现在界面上来表示登录成功 b.进一步分析:ECShop后台登录后界面里有frame,如果在主网页里找“退出”是找不到的 c.改进:切换到头部frame里,再查找“退出” d.问题:如果没有头部frame,切换frame会报错,代码不够健壮,希望当被测系统有缺陷时,不是运行代码报错,而是记录检查失败。 e.解决方案:检查头部frame是否存在,如果存在,再切换到头部frame里,再查找“退出”看是否存在。 f.补充1:测试前,被测系统是未登陆状态,测试后,最好恢复为未登录状态,最后检查做完后点击“退出”。 说明:unittest框架里的assert开头断言方法一旦失败,就停止运行。 g.补充2:所有断言方法都可以加一个可选参数msg来描述断言失败时在日志里显示的出错信息,加上该参数后,调试代码更容易发现代码问题。---了解! 示例: self.assertTrue(b11,msg="登录后主网页里没有出现头部frame") (2)第二种检查:测试用例文档中预期结果编号是2的情况,先检查弹出一个提示框,再切换到弹出框里,获得弹出框里的文本来检查文本内容(等于xx,包含xx,以xx开头或以xx结尾),点击“确定”关闭它,检查提示框消失。 a.说明:检查文本等于某值时,必须把预期值和实际值写的完全相同,如果想大概检查一下文本,可以换成检查文本中包含某预期字符串,这样代码更容易书写和维护。 b.补充:检查弹出框消失时,可以调用is_alert_present函数,对返回值做assertFalse的检查即可。 (3)第四种检查:检查代码与第二种检查代码相似,只有预期提示信息不同。 a.问题:当测试数据量很大,而想重点调试的那一行数据又比较靠后,调试代码效率低。解决方案是把测试数据复制一份,把本次要测试的那一条数据剪切到所有数据之前 ,再用这一份数据来测试。 (4)第五种检查:检查提示信息里包含某值。 练习:参考第二种检查,自己实现第四种检查和第五种检查,调试代码。 (5)第三种检查: a.检查跳转到系统信息页:通过检查网页标题以“系统信息”结尾来检查跳转成功 b.检查网页里的信息内容是否是“您输入的帐号信息不正确。”,检查方法一就是定位到该元素,获得其文本,再检查文本等于某值或包含某值,因为该网页只出现短短3秒时间,所以不方便去调查元素的定位方法,检查方法二就是获得当前网页源代码,然后检查其中包含预期字符串即可。 c.自动跳转回登录页:通过检查网页标题以“管理中心”结尾来检查跳转回登录页。 d.检查登录页里的密码文本框为空:定位密码文本框后,获得其当前内容,最后检查该内容等于空字符串。 (6)第六种检查: a.对于出现时间特别短的网页,为了调查网页元素的定位方法,可以考虑打印源代码到日志里查看 print(self.driver.page_source) b.检查网页跳转:可以检查网页标题,也可以目标网页里的元素出现来代表跳转成功 2.前台登录模块:实现代码过程参考后台登录,基本相似。 3.批量运行测试用例文件: (1)应用场景:有很多模块的很多测试用例想要运行代码。 (2)批量运行:需要使用unittest里的测试套件技术,在unittest里测试套件是多个测试用例的集合。 (3)前提要求:所有测试用例代码文件都放在同一个包里,并且符合一定的命名规则,比如都放在case包里,都以case.py的文件名结尾。 (4)unittest里测试套件实现过程: a.ecshopv1下新建包suite,用于存储测试套件文件 b.suite包里新建python file,名称test_all.py c.加载用例到套件里:使用unittest模块里的defaultTestLoader(默认测试加载器)的discover方法来查找指定包里指定命名规则的python文件,加载到一个测试套件里,作为discover方法返回值返回,我们存储在一个测试套件的变量里。其中discover方法的两个参数分别是包和文件名称规则。 b.运行指定套件:先实例化测试运行器(使用unittest模块自带的TextTestRunner类),再调用TextTestRunner类里的run方法来运行套件,参数就是测试套件对象。 说明:TextTestRunner类构造函数有可选参数verbosity代表测试结果记录的详细程度,默认值1代表显示粗略测试结果,如果设置为2,代表显示详细测试结果。 r1=unittest.TextTestRunner(verbosity=2) 示例: import unittest if __name__ == '__main__': # 加载case包里的所有case.py结尾的文件到一个测试套件ts1中 pkg="../case/" casefile="*case.py" ts1=unittest.defaultTestLoader.discover(pkg,casefile) # 运行指定测试套件 r1=unittest.TextTestRunner() r1.run(ts1) (5)问题:测试结果只显示在日志里 解决方案:用另一个第三方测试运行器HTMLTestRunner来代替unittest框架里自带的TextTestRunner,这样不仅可以在日志里显示测试结果,还可以生成一个单独的html格式的测试结果报告文件用于在浏览器里展示一份清晰的结果,也可以分享给相关人员。 a.复制百度网盘\Selenium资料\HTMLTestRunner.py,粘贴到util包里或Python安装路径下Lib文件夹里。 b.在ecshopv1包上右击菜单新建Python Package,包名是report,这个包用于存储生成的测试结果报告文件。 注意:包必须手工创建,包里的文件会自动生成。 c.复制test_all.py粘贴到suite包里,改名为test_all2.py,修改代码,先导入HTMLTestRunner类,然后打开指定包里的测试报告文件(文件如果不存在,会新建,如果存在,会覆盖内容),实例化HTMLTestRunner,调用run方法运行指定测试套件。 说明:HTMLTestRunner类构造函数参数有一个必填项,是文件路径和名称,还有可选项verbosity=2代表显示详细测试结果,可选项title代表测试结果报告的网页标题。 d.运行结束后,通过在html文件上右击菜单里选择Open in browser下面一款已安装的浏览器名称,来用特定浏览器打开该测试结果报告的网页。 示例: from ecshopv1.util.HTMLTestRunner import HTMLTestRunner 把原来测试套件里的最后两行代码修改为: with open("../report/test_report.html",'wb') as f: r1=HTMLTestRunner(f,verbosity=2,title="Selenium Report") r1.run(ts1)
一、总结规则 1.检查弹出框: (1)检查弹出框弹出来 (2)切换到弹出框 (3)获得弹出框里的文本 (4)检查该文本等于xx,包含xx等。 (5)关闭弹出框 (6)检查弹出框能被关闭(消失) 2.检查网页跳转: (1)方式一:检查当前网页标题等于xx,包含xx等 (2)方式二:检查当前网页源代码里包含xx。 (3)方式三:检查目标元素能被定位到 3.检查出现时间特别短的网页里的元素内文本 (1)方式一:检查当前网页源代码里包含xx (2)方式二:打印当前网页源代码,从日志里查看源代码,分析出元素的定位方法,然后定位元素,获得文本,检查文本。 二、unittest测试套件优化 1.问题:每次运行都会覆盖前一次运行生成的测试结果报告文件。 需求:如何保留每次运行的测试结果报告? 解决方案:尽量让每次打开的文件名都与以前的文件名不同,就会生成新文件。可以在文件名称里字符串连接的方式连接进去一个运行代码当时的系统日期时间,这样每次都是新的
文件名称。 2.使用技术:time模块里的strftime函数,参数是描述字符串格式的字符串,描述格式的符号中%Y%m%d表示年月日,%H%M%S表示时分秒。 3.按照指定格式生成当前系统日期和时间的字符串,存储在变量currenttime里,然后把这个变量的值连接到文件名称中.html前面。 示例: from time import strftime # 获得当前系统日期时间,#20201126_095034 currenttime=strftime("%Y%m%d_%H%M%S") with open("../report/test_report_%s.html"%currenttime,'wb') as f: r1=HTMLTestRunner(f,verbosity=2,title="Selenium Report") r1.run(ts1)