《一头扎进》系列之Python+Selenium框架实战篇8 - 年底升职加薪,年终奖就差最后这一步你知道不???
<h3>1.简介</h3><p> 到上一篇为止,测试报告已经完美的生成,但是你此时不要沾沾自喜,因为还差点意思,你才能升职加薪、拿年终奖。差点啥了???听宏哥给你慢慢道来。那就是把你生成的高端大气上档次的测试报告给领导展示一番,吹嘘一番。不把测试报告发出去好好地在领导面前表现一番,你留着生娃过年吗?这马上就新年了,你还真的留着它生娃啊???辛苦了这么久升职加薪,拿年终奖就靠这一把了。今天这篇文章宏哥就给小伙伴和童鞋们来答疑解惑了,当然了方式方法多种多样的,你可以通过邮件、QQ、微信将测试报告附件手动写邮件发送给相关负责人。这里宏哥讲解如何将测试报告自动发送给相关的负责人。</p>
<h3>2. 框架结构</h3>
<p> 先一睹为快,看看宏哥把邮件模块放在那里了,宏哥认为这个也是固定的只要封装好,在需要用到的地方进行导入和调用就可以了。因为宏哥将它放在了framework文件夹下,如下图所示:</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191226101542466-436823471.png" alt=""></p>
<h3>3. 邮件模块封装</h3>
<p> 上边都说了,我们需要封装,因此这里给小伙伴或童鞋们分享一下邮件模块的封装,封装将最新的测试报告发送给测试负责人或者是领导,让他们看看你的成果,这个是你升职加薪,年终奖的砝码。相关代码如下:</p>
<h4>3.1 代码实现:</h4>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191226103229084-1376317205.png" alt=""></p>
<h4>3.2 参考代码:</h4>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -*- coding:utf-8 -*-</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2.注释:包括记录创建时间,创建人,项目名称。</span>
<span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(128, 0, 0, 1)">
Created on 2019-12-26
@author: 北京-宏哥 QQ交流群:705269076
Project: 《一头扎进》系列之Python+Selenium自动化测试框架实战篇8 - 年底了还没升职加薪,年终奖全靠它了!!!
</span><span style="color: rgba(128, 0, 0, 1)">'''</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 3.导入模块</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> os, sys
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> smtplib
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> time
</span><span style="color: rgba(0, 0, 255, 1)">from</span> email.mime.text <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> MIMEText
</span><span style="color: rgba(0, 0, 255, 1)">from</span> email.mime.multipart <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> MIMEMultipart
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">reportPath = os.path.join(os.getcwd(), 'test_report')# 测试报告的路径</span>
reportPath = os.path.dirname(os.path.abspath(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span>)) + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test_report/</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> reportPath = "E:\\untitled\\automation_framework_demo\\test_report"# 测试报告的路径</span>
<span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">打印路径:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(reportPath)
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> SendMail(object):
</span><span style="color: rgba(0, 0, 255, 1)">def</span> get_report(self):<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 该函数的作用是为了在测试报告的路径下找到最新的测试报告</span>
<span style="color: rgba(0, 0, 0, 1)">
dirs </span>=<span style="color: rgba(0, 0, 0, 1)"> os.listdir(reportPath)
dirs.sort()
newreportname </span>= dirs[-1<span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The new report name: {0}</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">.format(newreportname))
</span><span style="color: rgba(0, 0, 255, 1)">return</span> newreportname<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 返回的是测试报告的名字</span>
<span style="color: rgba(0, 0, 255, 1)">def</span> take_messages(self):<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 该函数的目的是为了 准备发送邮件的的消息内容</span>
newreport =<span style="color: rgba(0, 0, 0, 1)"> self.get_report()
self.msg </span>=<span style="color: rgba(0, 0, 0, 1)"> MIMEMultipart()
self.msg[</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Subject</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">BBA JIT自动化测试报告</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 邮件的标题</span>
self.msg[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">date</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = time.strftime(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%a, %d %b %Y %H:%M:%S %z</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
with open(os.path.join(reportPath, newreport), </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">rb</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) as f:
mailbody </span>= f.read()<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 读取测试报告的内容</span>
html = MIMEText(mailbody, _subtype=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(128, 0, 0, 1)">'</span>, _charset=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span>)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 将测试报告的内容放在 邮件的正文当中</span>
self.msg.attach(html)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 将html附加在msg里</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> html附件 下面是将测试报告放在附件中发送</span>
att1 = MIMEText(mailbody, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">base64</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
att1[</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Content-Type</span><span style="color: rgba(128, 0, 0, 1)">"</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">application/octet-stream</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
att1[</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Content-Disposition</span><span style="color: rgba(128, 0, 0, 1)">"</span>] = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">attachment; filename="TestReport.html"</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 这里的filename可以任意写,写什么名字,附件的名字就是什么</span>
<span style="color: rgba(0, 0, 0, 1)"> self.msg.attach(att1)
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> send(self):
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> recipients = ['xxxx@xxxx.com', 'xxxx@qq.com', 'xxx@xxxxx.com']# 发送给多个人</span>
recipients = [<span style="color: rgba(128, 0, 0, 1)">'hg</span><span style="color: rgba(128, 0, 0, 1)">xxx@nnnx.cn</span><span style="color: rgba(128, 0, 0, 1)">'</span>] <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">发送给一个人</span>
<span style="color: rgba(0, 0, 0, 1)"> self.take_messages()
self.msg[</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">from</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = <span style="color: rgba(128, 0, 0, 1)">'h</span><span style="color: rgba(128, 0, 0, 1)">g@xxx.cn</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 发送邮件的人,这种是公司邮箱转发</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">self.msg['to'] = recipients# 收件人和发送人必须这里定义一下,执行才不会报错。</span>
toaddrs =<span style="color: rgba(0, 0, 0, 1)"> recipients
smtp </span>=<span style="color: rgba(0, 0, 0, 1)"> smtplib.SMTP()
smtp.connect(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">smtp.mxhichina.com</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
smtp.ehlo()
smtp.login(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hg@xxx.cn</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">*******xxxx</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
smtp.sendmail(self.msg[</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">from</span><span style="color: rgba(128, 0, 0, 1)">'</span>], toaddrs, self.msg.as_string())<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 发送邮件</span>
<span style="color: rgba(0, 0, 0, 1)"> smtp.close()
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sendmail success</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
sendMail </span>=<span style="color: rgba(0, 0, 0, 1)"> SendMail()
sendMail.send()</span></pre>
</div>
<h4>3.3 运行结果:</h4>
<p>运行代码后,控制台打印如下图的结果</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191226103344161-1629913332.png" alt=""></p>
<h4>3.4 验证是否是最新测试报告</h4>
<p>从3.3中控制台运行结果宏哥打印的结果看出最新的测试报告是:</p>
<div class="cnblogs_code">
<pre>The new report name: 2019-12-25-11_03_42HTMLtemplate.html</pre>
</div>
<p>我们去存储测试报告文件的test_report文件夹看一下是不是这个:是不是最新的测试报告</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191226132033906-829957124.png" alt=""></p>
<p> </p>
<p>综上所述:从控制台打印结果和测试报告文件夹的测试报告文件比较,我们可以清楚地看出二者一致,证明达到了预期的结果。</p>
<h3>4. 查看收件箱</h3>
<h4>4.1 查看收件箱</h4>
<p>在邮件的收件箱中查看到,我们刚刚发送的邮件如下图所示:</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191226104343594-1833421715.png" alt=""></p>
<h4>4.2 查看邮件内容</h4>
<p>点击查看邮件内容如下图所示:</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191226104053288-1978326421.png" alt=""></p>
<h4>4.3 查看邮件附件</h4>
<p>用浏览器打开附件预览查看如下图所示:</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191226104227906-294137950.png" alt=""></p>
<h3>5. 小结</h3>
<p>Q:最后说明一下,有的小伙伴或者童鞋们私下会问,那个测试报告能不能在邮件里像在浏览器里一样可以点击?<br>A:不可以的生成的文件是HTML文件,邮件客户端解析不了,可以通过附件用浏览器打开查看,可以发一个最新测试报告ur地址,点击在浏览器上访问查看测试报告</p>
<p> 好了,今天的分享就到这里吧!!!谢谢各位的耐心阅读。有问题加群交流讨论!!!</p>
<p> </p>
<p style="text-align: center"><span style="font-size: 14pt">您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得随手点波<strong> <span style="font-size: 18pt; color: rgba(255, 0, 0, 1)">推荐</span> </strong>不要忘记哦!!!</span></p>
<p style="text-align: center"><span style="font-size: 14pt">别忘了点 <strong><span style="font-size: 18pt; color: rgba(0, 255, 0, 1)">推荐</span> </strong>留下您来过的痕迹</span></p>
<p style="text-align: center"><span style="font-size: 14pt"> </span></p>
<p><span style="font-size: 14pt"><img style="display: block; margin-left: auto; margin-right: auto" src="https://img2018.cnblogs.com/blog/1232840/201908/1232840-20190816135641371-1314831001.gif" alt=""></span></p>
</div>
<div id="MySignature" role="contentinfo">
<div id="MySignature" style="display: block">
<div style="font-size: 13px; border: 1px dashed rgb(45, 161, 45); padding: 10px 15px; background-color: rgb(248, 248, 248)">
<label style="font-weight: bold">
为了方便大家在移动端也能看到我分享的博文,现已注册个人微信公众号,扫描左下方二维码即可,欢迎大家关注,提前解锁更多测试干货!有时间会及时分享相关技术博文。
</label>
<br>
<label style="font-weight: bold">
为了方便大家互动讨论相关技术问题,刚刚建立了咱们的专门的微信群交流互动群,群内会分享交流测试领域前沿知识。请您扫描中间的微信二维码进群
</label>
<br>
<label style="font-weight: bold">
为了方便大家互动讨论相关技术问题,现已组建专门的微信群,由于微信群满100,请您扫描右下方宏哥个人微信二维码拉你进群
<label style="font-weight: bold; color: red; font-size: 15px">
(请务必备注:已关注公众号进群)平时上班忙(和你一样),所以加好友不及时,请稍安勿躁~
</label>
,欢迎大家加入这个大家庭,我们一起畅游知识的海洋。
</label>
<br>
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
<br>
如果您觉得阅读本文对您有帮助,请点一下左下角
“推荐”
按钮,您的
<label style="font-weight: bold; color: red; font-size: 15px">
“推荐”
</label>
将是我最大的写作动力!另外您也可以选择
【
<strong>
关注我
</strong>
】
,可以很方便找到我!
<br>
本文版权归作者和博客园共有,来源网址:
https://www.cnblogs.com/du-hong
欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
</div>
<div style="text-align: center; margin-top: 10px">
<p style=" font-weight: bolder; color: red; ">
公众号(关注宏哥)     
        
       
       
微信群(扫码进群)    
       
       
    
      
      客服微信
</p>
<img style="width: 200px;padding-right: 50px;" alt="个人微信公众号" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191119095948011-608816619.png">
<img style="width: 200px;padding-right: 65px;" alt="微信群" src="https://img2024.cnblogs.com/blog/1232840/202506/1232840-20250610113707419-637869921.png">
<img style="width: 200px" alt="个人微信" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191106101257091-849954564.png">
</div>
</div><br><br>
来源:https://www.cnblogs.com/du-hong/p/12097568.html
頁:
[1]