在前面生成自动化框架中讲解了一步步生成日志,报告。生成测试报告之后需要提交给他人查看,自然需要用到右键发送的功能,这里学习一下smtplib 和 email 库。
在utils中创建mail.py,初始化时传入全部所需数据,message是正文,可不填,path可以传list或者str;receiver支持多人,用”;”隔开就行
#coding:utf-8
'''
邮件类。用来给指定用户发送邮件。可指定多个收件人,可带附件。
'''
import re
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from socket import gaierror,error
from Framework.utils.log1 import logger
class Email():
def __init__(self,server,sender,password,receiver,title,message = None,path = None):
'''
intial Email
:param server:smtp server,M
:param sender:
:param password:
:param receiver:
:param title:
:param message:the content of mail
:param path:附件路径,可传入list(多附件)或str(单个附件),非必填。
'''
self.title = title
self.message = message
self.files = path
self.msg = MIMEMultipart('related')
self.server = server
self.sender = sender
self.receiver = receiver
self.passwd = password
def _attach_file(self,att_file):
'''
将单个文件添加到附件列表中
:param att_file:
:return:
'''
att = MIMEText(open('%s' % att_file,'rb'),'plain','utf-8')
att['Content-Type'] = 'application/octet-stream'
file_name = re.split(r'[\\|/]',att_file)
att['Content-Disposition'] = 'attachment;filename="%s"' % file_name[-1]
self.msg.attach(att)
logger.info("attach file {}".format(att_file))
def send(self):
self.msg['Subject'] = self.title
self.msg['From'] = self.sender
self.msg['To'] = self.receiver
#the content of mail
if self.message:
self.msg.attach(MIMEText(self.message))
#添加附件,支持多个附件(传入list),或者单个附件(传入str)
if self.files:
if isinstance(self.files,list):
for f in self.files:
self._attach_file(f)
elif isinstance(self.files,str):
self._attach_file(self.files)
#连接服务器并发送
try:
smtp_server = smtplib.SMTP(self.server)
except (gaierror and error) as e:
logger.exception("邮件发送失败,无法连接到SMTP服务器,检查网络以及SMTP服务器。%s", e)
else:
try:
smtp_server.login(self.sender,self.passwd)#login
except smtplib.SMTPAuthenticationError as e:
logger.exception("用户名密码验证失败!%s", e)
else:
#发送邮件
smtp_server.sendmail(self.sender,self.receiver.split(';'),self.msg.as_string())
finally:
smtp_server.quit()#断开连接
logger.info('发送邮件成功"{0}"成功!收件人:{1}。如果没有收到邮件,请检查垃圾箱,'
'同时检查收件人地址是否正确'.format(self.title,self.receiver))
修改test_baidu6.py,完成测试用例的执行并进行邮件的发送
#coding:utf-8
"""test_baidu6.py.add a function of send mail"""
import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from Framework.utils.config import Config, DRIVER_PATH, DATA_PATH,REPORT_PATH
from Framework.utils.log import logger
from Framework.utils.file_reader1 import ExcelReader
from Framework.utils.mail import Email
import HTMLTestRunner
class TestBaiDu(unittest.TestCase):
URL = Config().get('URL')
excel = DATA_PATH + '/baidu.xlsx'
locator_kw = (By.ID,'kw')
locator_su = (By.ID,'su')
locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')
def sub_setUp(self):
self.driver = webdriver.Chrome(executable_path=DRIVER_PATH + '/chromedriver.exe')
self.driver.get(self.URL)
print "DATA_PATH:",DATA_PATH
def sub_tearDown(self):
self.driver.quit()
def test_search(self):
datas = ExcelReader(self.excel).data
print datas
for d in datas:
print "d['search']",d['search']
self.sub_setUp()
print "self.driver",self.driver
self.driver.find_element(*self.locator_kw).send_keys(d['search'])
self.driver.find_element(*self.locator_su).click()
time.sleep(1)
#开始是find_element,由于定位的是信息是一组信息(selenium和python selenium),因此需要使用find_elements()进行定位
links = self.driver.find_elements(*self.locator_result)
for link in links:
logger.info(link.text)
self.sub_tearDown()
if __name__ == '__main__':
report = REPORT_PATH + '\\report.html'
with open(report, 'wb') as f:
runner = HTMLTestRunner(f, verbosity=2, title='从0搭建测试框架 灰蓝', description='修改html报告')
runner.run(TestBaiDu('test_search'))
e = Email(title='百度搜索测试报告',
message='这是今天的报告,请查收!',
receiver='...',
server='...',
sender='...',
password='...',
path=report
)
e.send()