今天跟大家细讲如何构建一个完整的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" % filename
driver.get(result_url)
sleep(3)
res = driver.find_element_by_xpath("/html/body/div[1]/p[4]").text
result = 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_Sender
password = baseinfo.Smtp_Sender_Password
receiver = baseinfo.Smtp_Receiver
smtp.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'] = sender msg['To'] = ",".join(receiver)
tmp = smtp.sendmail(sender, receiver, msg.as_string()) print tmp
smtp.quit() return True
except 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' @ classmethod
def setUpClass(self):
self.driver = webdriver.Firefox()
time.sleep(1)
self.driver.maximize_window() @ classmethod
def 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_dir now = time.strftime("%Y-%m-%d")
filename = report_dir + '\\report-' + now + '.html'
# print filename
fp = open(filename, 'wb')
runner = HTMLTestRunner(stream=fp, title='UI自动化测试报告', description='用例执行情况')
runner.run(getTestcases.testcaseDir(test_dir))
fp.close()
result = getTestResult.get_result(filename) print result
mail = sendEmail.send_Mail(filename, result) if mail:
print(u"邮件发送成功!") else:
print(u"邮件发送失败!")

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

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

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

快速构建一个完整的Selenium框架的更多相关文章

  1. springboot:快速构建一个springboot项目

    前言: springboot作为springcloud的基础,springboot的热度一直很高,所以就有了这个springboot系列,花些时间来了解和学习为自己做技术储备,以备不时之需[手动滑稽] ...

  2. 【jQuery插件】用jQuery Masonry快速构建一个pinterest网站布局(转)

    [jQuery插件]用jQuery Masonry快速构建一个pinterest网站布局 时间:2011年03月21日作者:愚人码头查看次数:29,744 views评论次数:25条评论 前段时间领导 ...

  3. 转载自 BotVS 「 珍藏版 」如何搭建一个完整的交易框架

    [img]http://dn-filebox.qbox.me/8c218c119046b2a25df2d9c7b00c1e0fa6899bdd.png[/img]NO:01 交易策略 ≠ 交易系统. ...

  4. 快速构建一个简单的单页vue应用

    技术栈 vue-cli webpack vux,vux-loader less,less-loader vue-jsonp vue-scroller ES6 vue-cli:一个vue脚手架工具,利用 ...

  5. 快速构建一个 Springboot

    快速构建一个 Springboot 官网:http://projects.spring.io/spring-boot/ Spring Boot可以轻松创建可以“运行”的独立的,生产级的基于Spring ...

  6. 快速构建一个vue项目

    首先介绍一下命令行构建一个vue项目步骤: 1.下载安装node.js(直接运行安装包根据步骤安装完),打开命令行输入:node -v ,出现版本号即安装成功. 2.命令行界面输入:cnpm inst ...

  7. 快速构建一个使用axios的vue应用程序(转)

    英文原文:https://www.sitepoint.com/fetching-data-third-party-api-vue-axios/ 译文:https://segmentfault.com/ ...

  8. 基于react+如何搭建一个完整的前端框架(1)

      1.使用 create-react-app 快速构建 React 开发环境 create-react-app 是来自于 Facebook,通过该命令我们无需配置就能快速构建 React 开发环境. ...

  9. 快速构建一个springboot项目(一)

     前言: springcloud是新一代的微服务框架而springboot作为springcloud的基础,很有必要对springboot深入学习一下. springboot能做什么? (1)spri ...

随机推荐

  1. 原生JS 实现点击按钮创建元素

    要求: 点击按钮,随机生成一个20px-100px宽度正方形,随机颜色,随机位置,不能出可视区域外 思路:(1)创建按钮,为按钮添加事件侦听 (2)触发事件,创建一个元素 (3)设置元素样式,包括大小 ...

  2. luogu P1784 数独 dfs 舞蹈链 DXL

    LINK:数独 这道题好难 比DXL模板题要难上不少. 首先 还是考虑将行当做决策 那么 一共有\(9*9*9=729\) 个决策. 考虑列用来填充 需要有的条件为 某个位置能能放一次\(9*9\) ...

  3. C笔记-左值与右值

    目录 前言:工欲善其事,必先利其器 两种资料 参考资料及其使用说明 官方对于左值和右值的定义 实际使用时的疑问 左值的涵盖范围 重要概念: 左值转化(lvalue conversion) 左值与指针 ...

  4. 07 . ELK Stack一键多机部署脚本

    一键部署脚本 目录结构 tree Log_Analysis_Platform_Document Log_Analysis_Platform_Document ├── InstallES.sh ├── ...

  5. Android RecyclerView的补充。

    明天写吧.. 今天写,然后再写今天的内容,虽然结课了,我们还是得学习,所以如果我学习了一些知识,不出意外每天会持续更新的. RecyclerView其实是可以完全代替ListView的存在, 但是为啥 ...

  6. WebService简单Demo

    看了网上好多关于webservice的例子,基本上对初学者来说都是模棱两可云里雾里,现在,我将网上关于webservice的讲解提炼出来,通过一个最简单使用并且方便的例子,告诉大家什么是webserv ...

  7. 微信公众号添加zip

    微信公众号添加zip的教程 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下是公众号添加 ...

  8. 我搭的神经网络不work该怎么办!看看这11条新手最容易犯的错误

    1. 忘了数据规范化 2. 没有检查结果 3. 忘了数据预处理 4. 忘了正则化 5. 设置了过大的批次大小 6. 使用了不适当的学习率 7. 在最后一层使用了错误的激活函数 8. 网络含有不良梯度 ...

  9. nginx进程模型解析

    nginx进程模型解析 概念   master会发送请求给worker,用于处理用户的请求,模型图如下 nginx进程分类   master进程(只有1个)    接受信号传递给worker   wo ...

  10. C++实现哈夫曼编码/译码器(数据结构)

    设计一个哈夫曼编码.译码系统.对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件:反过来,可将编码文件译码还原为一个文本文件.(1) 从文件中读入任意一篇英文短文(文件为ASCII编码 ...