今天跟大家细讲如何构建一个完整的selenium框架,当你学会了这一篇你就也可以说自己会selenium自动化测试了。

1、新建项目,结构如图:

注意:整个项目除了最外层的是文件夹,其他的都是包(package)。也就是说每一个文件夹下面都是有一个_init _.py文件的。只有包才能顺利的用import导入哦~~

2、文件介绍及代码

baseinfo

    这里面只有一个__init __.py文件,里面放的是常量:比如邮件的设置信息、发送的固定URL等。
# coding: utf-8'''
发送邮件参数
'''Smtp_Server = 'smtp.mxhichina.com'Smtp_Sender = 'abc@tenez.cn'Smtp_Sender_Password = '**********'Smtp_Receiver = ['312652826@qq.com', 'warrior_meng08@163.com']

module

这个包下面有:__init __.py(确定它是包而不是文件夹的文件),getTestcase.py——获取测试用例文件;getTestResult.py——获取用例执行结果文件,以及sendEmail.py——发送邮件文件。这个包里放的都是封装好的方法,也就是说以后我们只需要调用这些方法就可以实现相应的功能了。

__init __.py

这个文件里面的内容:

# coding: utf-8import getTestcasesimport sendEmailimport getTestResult

正如大家看到的,这里面只有几个import,这样写是为了后面利用from module import * 这种导入方式,如果不在__init __.py里写这些导入的话,前面的那种导入方式是不能用的。

getTestcase.py

# coding: utf-8import unittestimport osdef testcaseDir(test_directory):'''os.walk()传入顶层文件夹路径,返回三个内容:            1、根路径;            2、路径下所有文件夹名;            3、路径下所有非文件夹名【2,3都是以列表形式返回】这个是遍历文件夹,然后遍历对应文件夹下面的文件            '''# for a, b, c in os.walk(test_directory):#     for dirs in b:#         test_dir = '%s\\%s' % (test_directory, dirs)#         test_discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py', top_level_dir=test_dir)#         return test_discover'''事实证明加了文件夹也没关系,但是不能是文件夹,必须是包,也就是你新建的时候必须选package(必须有__init__.py文件)'''discover = unittest.defaultTestLoader.discover(test_directory, pattern='test*.py', top_level_dir=test_directory)    return discover

这个方法是读取testcase文件夹(包)里面的测试用例。大家也看到了,一开始我建的就是文件夹,然后怎么样都读不出testcase文件夹下面的文件夹里面的用例,最后我写了一个具体的遍历文件夹的方法,然后去读用例,最后经人指点,加了__init __.py方法,把文件夹变成了包,瞬间就OK了。

getTestResult.py

# coding: utf-8from selenium import webdriverfrom time import sleepdef get_result(filename):driver = webdriver.Firefox()driver.maximize_window()    # 得到测试报告路径result_url = "file://%s" % filenamedriver.get(result_url)sleep(3)res = driver.find_element_by_xpath("/html/body/div[1]/p[4]").textresult = res.split(':')driver.quit()    return result[-1]

这个方法是将生成的测试报告对应的测试运行结果拿出来,到时候作为发送邮件的标题发送。

sendEmail.py

# coding: utf-8import smtplibimport baseinfoimport timefrom email.mime.multipart import MIMEMultipartfrom email.header import Headerfrom email.mime.text import MIMETextdef send_Mail(file_new, result):f = open(file_new, 'rb')    # 读取测试报告正文mail_body = f.read()f.close()    try:smtp = smtplib.SMTP(baseinfo.Smtp_Server, 25)sender = baseinfo.Smtp_Senderpassword = baseinfo.Smtp_Sender_Passwordreceiver = baseinfo.Smtp_Receiversmtp.login(sender, password)msg = MIMEMultipart()text = MIMEText(mail_body, 'html', 'utf-8')text['Subject'] = Header('UI自动化测试报告', 'utf-8')msg.attach(text)now = time.strftime("%Y-%m-%d")msg['Subject'] = Header('[ 执行结果:' + result + ' ]'+ 'UI自动化测试报告' + now, 'utf-8')msg_file = MIMEText(mail_body, 'html', 'utf-8')msg_file['Content-Type'] = 'application/octet-stream'msg_file["Content-Disposition"] = 'attachment; filename="TestReport.html"'msg.attach(msg_file)msg['From'] = sendermsg['To'] = ",".join(receiver)tmp = smtp.sendmail(sender, receiver, msg.as_string())        print tmpsmtp.quit()        return Trueexcept smtplib.SMTPException as e:print(str(e))        return False

发送邮件的方法,都是一个道理。

test_report

testReport_path.py

# coding: utf-8import os# 获取当前文件夹路径def report_path():return os.path.split(os.path.realpath(__file__))[0]

testcase

login

testLogin1.py【测试用例1】

# coding: utf-8from selenium import webdriverimport timeimport unittestimport baseinfoimport sys
reload(sys)
sys.setdefaultencoding('utf8')class TestLogin(unittest.TestCase):print '1.这是testLogin1用例打印内容,文件夹login'@ classmethoddef setUpClass(self):self.driver = webdriver.Firefox()time.sleep(1)self.driver.maximize_window()    @ classmethoddef tearDownClass(self):time.sleep(1)self.driver.quit()    def test_purchase(self):print(u"因未找到对应元素,测试用例未正常执行!")

testLogin2【测试用例2】

# coding: utf-8import unittestclass testLogin2(unittest.TestCase):def setUp(self):print '2.这是testLogin2文件夹下面的setup方法'def test11(self):return '3.return 方法返回'def testLogin(self):print 222

testcase2

testBuy.py【测试用例3】

# coding: utf-8import unittestclass testBuy(unittest.TestCase):print '4.这是testBuy方法,来自testcase2文件夹'def testPrint(self):print '5.这是test_1打印的内容,文件夹是testcase2'

testSell.py【测试用例4】

# coding: utf-8print '6.这里只有print--testSell.py文件'

与login和testcase2文件夹同级文件testcase_path.py

# coding: utf-8import os# 获取当前文件夹路径def dir_path():return os.path.split(os.path.realpath(__file__))[0]

如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以加软件测试交流:1085991341,会有不定期的发放免费的资料链接,还会有同行一起技术交流。

runtest.py

# coding: utf-8import timefrom module import *from testcase import testcase_pathfrom test_report import testReport_pathfrom HTMLTestRunner import HTMLTestRunnerif __name__ == '__main__':        # 测试用例路径test_dir = testcase_path.dir_path()    # 测试报告存放路径report_dir = testReport_path.report_path()    # print report_dirnow = time.strftime("%Y-%m-%d")filename = report_dir + '\\report-' + now + '.html'# print filenamefp = open(filename, 'wb')runner = HTMLTestRunner(stream=fp, title='UI自动化测试报告', description='用例执行情况')runner.run(getTestcases.testcaseDir(test_dir))fp.close()result = getTestResult.get_result(filename)    print resultmail = sendEmail.send_Mail(filename, result)    if mail:print(u"邮件发送成功!")    else:print(u"邮件发送失败!")

用例执行这里只有一个方法,其他全是调用module文件夹下面的方法。

大家注意一下我的用例,运之后可以看到输出结果:

只有1、4、6打印出来了哦,其他的是不会打印的,也就是说你在用例里写的print是不会打印的,这是因为HTMLTestRunner.py规定的。试过自己修改过的可以打印用例里面的print了,但是会返回很多None,也就是说出里面会有好多红色的None。
以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。

快速构建一个完整的Selenium框架相关推荐

  1. 如何使用ChatGPT快速构建一个网站模板

    前端Q 我是winty,专注分享前端知识和各类前端资源,乐于分享各种有趣的事,关注我,一起做个有趣的人- 公众号 点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流群 英文 | https:/ ...

  2. 如何使用ChatGPT快速构建一个网站模板?

    欢迎来到令人兴奋的自然语言处理和机器学习世界!今天,我们将探索 ChatGPT 的功能,它是由 OpenAI 公司开发的目前最先进的人工智能工具.当然,你也可以将其看作是一个智能机器人.ChatGPT ...

  3. iOS 教你使用MP、AVPlayer、AVPlayerVC构建一个完整的视频播放器

    1.前言 标题必须要浮夸!要感觉像是一个大新闻.长者如是说. 其实是前几天去面试的时候,被要求说必须做过视频播放相关项目.有点闹心之余,就花了点时间在家写了一个简单播放器,基本实现了主流播放器的大致功 ...

  4. 深度学习笔记:01快速构建一个手写数字识别系统以及张量的概念

    深度学习笔记:01快速构建一个手写数字识别系统 神经网络代码最好运行在GPU中,但是对于初学者来说运行在GPU上成本太高了,所以先运行在CPU中,就是慢一些. 一.安装keras框架 使用管理员模式打 ...

  5. myos1 大学生利用C++构建一个完整的操作系统打印helloworld

    myos1 大学生利用C++构建一个完整的操作系统打印helloworld myos2 大学生利用C++构建一个完整的操作系统之响应键盘中断 myos3 大学生利用C++构建一个完整的操作系统之代码重 ...

  6. 【spring authorization server系列教程】(一)入门系列,spring authorization server简介。快速构建一个授权服务器(基于最新版本0.3.0)

    系列文章目录 [spring authorization server系列教程](一)入门系列,快速构建一个授权服务器 文章目录 系列文章目录 前言 一.目前已实现的功能 二.入门,一步一步快速开始构 ...

  7. 使用飞冰+dva快速构建一个后台系统

    使用飞冰+dva快速构建一个后台系统 写在前面 最近我们接到这样一个需求,要写一个后台管理系统,时间很急,产品也只是给出了原型稿,把功能陈列了一下,给出的要求就是先注重功能,用起来再去考虑美化.但是作 ...

  8. 如何快速开发一个完整的ios直播app

    如何快速开发一个完整的iOS直播app 一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形 ...

  9. IDEA快速构建一个SpringBoot项目

    IDEA快速构建一个SpringBoot项目 1.new一个Spring Initialiar 项目 2.设置项目名字等 3.选择依赖,随便选几个就行,后面再到POM加依赖就行 4.POM文件加依赖, ...

最新文章

  1. 打开文件和关闭文件的含义
  2. Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索
  3. batch helper mv_batch_body fill logic technical_request-filter_string
  4. 电脑屏保海底世界_水下栖息地:人类能否在海洋中居住?真的有人住在海底吗?...
  5. 通过生日查询各年龄段数量通过饼状图显示
  6. UVALive - 6442
  7. Linux 发行版本简介 (zz)
  8. python win32api win32gui win32con PyUserInput实现自动化脚本
  9. Matlab与微分方程解析解(dsolve)
  10. 计算机竞赛等级,美国计算机奥林匹克竞赛等级
  11. Android基于安卓手机个人理财系统
  12. NO.83 常用二维码对比(QR、PDF417、DM、汉信码)
  13. android app如何后台自启动,商家骑手端允许后台运行APP设置方法(安卓)
  14. 免费且非常实用的PPT模板网站(免费)亲测可用!!
  15. gt 630 linux驱动下载,Ubuntu 13.04 双显卡安装NVIDIA GT 630M驱动
  16. 百度百聘企业简单信息获取
  17. 属兔2013年蛇年运程
  18. 保卫城市消费券安全,从这些做起
  19. MyZip Pro for Mac(专业解压缩工具)
  20. 什么情况下JVM内存中的一个对象会被垃圾回收

热门文章

  1. Mac系统W10系统安装adb
  2. iOS8开发视频教程Swift语言版-Part 9:iOS分层架构设-关东升-专题视频课程
  3. 70-设置前台进程组
  4. RK3568平台开发系列讲解(环境篇)编译 Android 固件
  5. Android 异常 regist too many Broadcast Receivers
  6. windows 修改(pip/conda)镜像源
  7. jQuery根据身份证号判断性别(18位)
  8. 我的世界服务器物品栏不见,我的世界:物品展示框离不开玩家,距离过远就会凭空消失?...
  9. Ancient Distance
  10. 详细介绍预处理#define和编译链接等有关知识