Selenium2 Python 自动化测试实战学习笔记(六)

1.1 创建定时任务

为了让自动化测试“自动化”起来,现在我们来创建定时任务,使自动化测试脚本在指定的时间自动化运行。创建定时任务的方法有很多,比如,我们可以写一段程序让其在指定的时间运行all_test.py 文件,或者使用系统的定时任务功能在指定的时间运行all_test.py文件。

在python的os模块中提供了system()用来执行系统命令。比如要执行:UnitTest\Project\run_all.py

可以这样实现:start_run.py

#coding=utf-8

import os

os.system(".\\run_all.py")

或者先切换到相应的目录,然后通过Python 命令去执行all_test.py文件更符合我们在cmd 下面的操作顺序。

Start_run.py

#coding=utf-8

import os

os.chdir(".\\Test_project")

os.system("run_all.py")

定时任务, 通过time 模块了,要实现这个功能非常简单,获取当前时间判断是不是要执行自动化的时间。Start_run.py:start_run.py

#coding=utf-8

import os,time

k=1

while k<2:

now_time=time.strftime("%H_%M")

if now_time=="21_00":

print "start to runscritpt!"

os.chdir(".\\UnitTest\\Project")

os.system("run_all.py")

print "Finished andexit!"

break

else:

time.sleep(10)

printnow_time

首先定义变量k 的值为1,通过while 判断k 的值是否小于2,在不改变k 的值

的情况下,k 会永远小于二,然后通过strftime()方法获取当前的小时和分钟,然后通过if 判断是否等于21:00,如果不相等,休眠10 秒(这个休眠时间只要不超过60 秒即可,超过了60 秒,可能直接会从20:59 跳到21:01,从而错过了21:00),当前时间为21:00 时执行all_test.py 程序从而执行自动化测试。并且break 结束循环。如果希望想每天21:00 跑自动化测试用例,那么可以不要break ,程序继续运行,直到遇见下一个20:00,自动化测试再次被执行。

Windows添加任务计划:其实操作系统本身也提供了强大的定时任务功能。Window7 为例,Window设置定时任务:通过控制面板—管理工具—任务计划程序(或者在“开始”菜单中搜索“任务计划程序”):

选择菜单栏中的“操作”选项可以选择“创建基本任务” 和“创建任务”,前者创建过程比较简单,我选择后者进行设置:

设置任务名和任务描述,以及执行任务的用例,切换到“触发器”标签页,点击“新建”设置出发任务的条件。

设置每天22:00:00 触发任务,然后点击“确定”。然后,切换到“操作”标签页:点击“新建”设置执行的操作。

选择运行程序或脚本,点击“浏览”按钮找到all_test.py 程序,点击“确定”。然后,我们就创建完成了一个任务计划,在任务计划库中就可以看到创建的任务计划了。

OK,现在我们可以验证一下任务设置的是否成功,在任务计划上右键选择“运行”,任务就可以开始运行了。

1.2 自动发邮件功能

Python的smtplib模块提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

Smtp协议的命令包括:

HELO                  向服务器标识用户身份

MAIL                  初始化邮件传输 mail from:

RCPT                  标识单个的邮件接收人;通常MAIL命令后面,可以有多个rcpt to:

DATA                           在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以“.”结束

VRFY                            用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令

EXPN                           验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用

HELP                  查询服务器支持什么命令

NOOP                 无操作,服务器应响应OK

QUIT                  结束会话

REST                   重置会话,当前传输被取消

MAIL FROM     指定发送者地址

RCPT TO          指明的接收者地址

一般smtp会话有两种方式,一种是邮件直接投递,比如发送邮件给:[email protected]那就直接连接126.com的邮件服务器,把信投递给[email protected];另一种是验证过后的发信,它的过程是,比如你要发件给[email protected],你不是直接投到126.com,而是通过自己的另一个邮箱来发。

1.2.1 发送HTML格式的邮件

Send_mail.py

#coding=utf-8

import smtplib

fromemail.mime.text import MIMEText

fromemail.header import Header

sender="username @126.com"

receiver="username @163.com"

subject="Pythonemail test"

smtpserver="smtp.126.com"

username="[email protected]"

password="password"

msg=MIMEText(‘<html><h1>hello</h1></html>‘,‘html‘,‘utf-8‘)

msg[‘subject‘]=Header(subject,‘utf-8‘)

smtp=smtplib.SMTP()

smtp.connect("smtp.126.com")

smtp.login(username,password)

smtp.sendmail(sender,receiver,msg.as_string())

smtp.quit()

import smtplib

导入smtplib 发邮件模块,程序中邮件的发送、接收等相关服务,全部由smtplib.SMTP 方法来完成。

from email.mime.text import MIMEText

from email.header import Header

导入email 模块,MIMEText和Header 主要用来完邮件内容与邮件标题的定义。

smtp.connect() 用于链接邮件服务器

smtp.login() 配置发送邮箱的用户名密码

smtp.sendmail() 配置发送邮箱,接收邮箱,以及发送内容

smtp.quit() 关闭发邮件服务

1.2.2 发送带附件的邮件

Send_emai_with_attch.py:

#coding=utf-8

import smtplib

fromemail.mime.text import MIMEText

fromemail.mime.multipart import MIMEMultipart

sender =‘[email protected]‘

receiver =‘[email protected]‘

smtpserver =‘smtp.126.com‘

username =‘[email protected]‘

password =‘123456‘

msgRoot =MIMEMultipart(‘related‘)

msgRoot[‘Subject‘]= ‘Python email test‘

att =MIMEText(open(‘\\report\\log.txt‘, ‘rb‘).read(), ‘base64‘,

‘utf-8‘)

att["Content-Type"]= ‘application/octet-stream‘

att["Content-Disposition"]= ‘attachment; filename="log.txt"‘

msgRoot.attach(att)

smtp = smtplib.SMTP()

smtp.connect(‘smtp.126.com‘)

smtp.login(username,password)

smtp.sendmail(sender,receiver, msgRoot.as_string())

smtp.quit()

与上一个实例相比,通过MIMEMultipart 模块构造带附件的邮件,附件本身同样使用MIMEText()方法定义路径和格式

1.2.3   查找最新的测试报告

在report\目录下找到最新生成的测试报告。New_file.py:

#coding=utf-8

import os

result_dir=".\\report"

lists=os.listdir(result_dir)

lists.sort(key=lambda fn: os.path.getmtime(result_dir+"\\"+fn))

print("the lastest receive:"+lists[-1])

file=os.path.join(result_dir,lists[-1])

print file

首先定义测试报告的目录result_dir ,通过os.listdir()可以获取目录下的所有文件。这也只是获取一个目录下的所有文件而已,我们最重要的任务是找到目录下最新生成的文件。

lists.sort(key=lambdafn: os.path.getmtime(result_dir+"\\"+fn))

用lambda 来声明匿名函数,冒号(:)前面表示入参,冒号后面表示返回值。

lists.sort():Python列表有一个内置的列表。sort()方法用于改变列表中元素的位置。还有一个sorted()内置函数,建立了一种新的迭代排序列表。

key=lambda fn:key是带一个参数的函数,用来为每个元素提取比较值.
默认为None, 即直接比较每个元素lambda提供了一个运行时动态创建函数的方法。我这里创建了fn 函数。

#定位一个数组

>>>ls=[‘c.txt‘,‘b.txt‘,‘d.txt‘,‘a.txt‘]

>>> ls

[‘c.txt‘, ‘b.txt‘, ‘d.txt‘, ‘a.txt‘]

#取数组中的key 做排序

>>>ls.sort(key=lambda lists:lists[0])

>>> print ls

[‘a.txt‘, ‘b.txt‘, ‘c.txt‘,‘d.txt‘]

>>>ls.sort(key=lambda lists:lists[1])

>>> print ls

[‘c.txt‘, ‘b.txt‘,‘d.txt‘, ‘a.txt‘]

lists:lists[0] 表示取的是每个元组中的前半部分,即为:c、b、d、a ,所以可进行排序。

lists:lists[1] 表示取的是每个元组中的后半部分,即为:txt,不能有效的进行排序规律,所以按照数组的原样输出。

os.path.getmtime():getmtime()返回文件列表中最新文件的时间(最新文件的时间最大,所以我们会得到一个最大时间)

通过上面一行代码的操作,lists 中的文件按照进间重时行的排列组合。如果想获最新的文件就取lists[-1]。

通过os.path.join()方法可以将文件目录与文件名进行拼接,从而打印出目录下最新文件的绝对路径。

1.2.4 整合自动发邮件功能

利用Python 实现发邮件功能,如何查找目录下最新的文件。下面要做的事情就是把这些功能整合到all_test.py 文件。:

#coding=utf-8

import smtplib

fromemail.mime.text import MIMEText

importunittest

importHTMLTestRunner

import time,os

defsend_mail(file_new):

mail_from=‘[email protected]‘

mail_to=‘[email protected]‘

f = open(file_new, ‘rb‘)

mail_body = f.read()

f.close()

msg=MIMEText(mail_body,_subtype=‘html‘,_charset=‘utf-8‘)

msg[‘Subject‘]=u"自动化测试报告"

msg[‘date‘]=time.strftime(‘%a, %d %b %Y%H:%M:%S %z‘)

smtp=smtplib.SMTP()

smtp.connect(‘smtp.126.com‘)

smtp.login(‘[email protected]‘,‘123456‘)

smtp.sendmail(mail_from,mail_to,msg.as_string())

smtp.quit()

print ‘email has send out !‘

defsend_report(testreport):

result_dir = testreport

lists=os.listdir(result_dir)

lists.sort(key=lambda fn:os.path.getmtime(result_dir+"\\"+fn))

file_new =os.path.join(result_dir,lists[-1])

print file_new

send_mail(file_new)

defcreatsuite():

testunit=unittest.TestSuite()

test_dir=‘.\\test_case‘

discover=unittest.defaultTestLoader.discover(test_dir,pattern=‘test*.py‘,top_level_dir=None)

fortest_suite in discover:

fortest_case in test_suite:

testunit.addTest(test_case)

printtestunit

returntestunitlp

if __name__ ==‘__main__‘:

now = time.strftime("%Y-%m-%d%H_%M_%S")

testreport = ‘.\\report\\‘

filename = testreport+now+‘result.html‘

fp = file(filename, ‘wb‘)

runner =HTMLTestRunner.HTMLTestRunner(

stream=fp,

title=u‘自动化测试报告‘,

description=u‘用例执行情况:‘)

alltestnames = creatsuite()

runner.run(alltestnames)

fp.close()

send_report(testreport)

send_mail(file_new):定义一个sentmail()发邮件函数,接收一个参数file_new,表示接收最新生成的测试报告文件。

open(file_new, ‘rb‘):以读写(rb)方式打开最新生成的测试报告文件。

mail_body = f.read():读取文件内容,将内容传递给mail_body。

MIMEText(mail_body,_subtype=‘html‘,_charset=‘utf-8‘):文件内容写入到邮件正文中。html格式,编码为utf-8。

send_report():定义sendreport()接收一个测试报告的目录,找到目录下最新生成的测试报告文件file_new。调用并将file_new 传给send_mail()函数。

程序执行过程:

首先,调用creatsuit()函数,将所测试用例装载到测试套件中。

其次,调用HTMLTestRunner 模块的run()函数,执行测试套件中的用例,并生成测试报告,然后,fp.close()关闭生成的测试报告文件。

接着,调用send_report()函数,查找测试报告目录下面最新生成的测试报告文件,并将最新报告文件的路径传给send_mail()函数,send_mail()函数实现发邮件功能。

整个过程执行完成,打开我们的接收邮箱将看到最新测试执行的测试报告

时间: 2024-10-02 01:51:35

Selenium2 Python 自动化测试实战学习笔记(六)的相关文章

Selenium2 Python 自动化测试实战学习笔记(七)

Selenium  Grid2 利用Grid可以在不同的主机上建立主节点(hub)和分支节点(node).使主节点上的测试用例在不同的分支节点上运行,可以搭建不同的环境,从而使一份测试用例完成在不同环境下的验证.Selenium Grid2已经集成到selenium server中了(selenium-server-stanalon-xxx.jar包中). 9.1 Selenium2工作原理 Selenium2 中因为使用的WebDriver,这个技术不是靠js 驱动的,而是直接调用浏览器的原生

Selenium2 Python 自动化测试实战学习笔记(五)

7.1 自动化测试用例 不管是功能测试.性能测试和自动化测试时都需要编写测试用例,测试用例的好坏能准确的体现了测试人员的经验.能力以及对项目的深度理解. 7.1.1 手工测试用例与自动化测试用例 手工测试用例是针对手工测试人员,自动化测试用例是针对自动化测试框架,前者是手工测试用例人员应用手工方式进行用例解析,后者是应用脚本技术进行用例解析. 前者具有较好的异常处理能力,而且能够基于测试用例,制造各种不同的逻辑判断,而且人工测试步步跟踪,能够细致定位问题.后者完全按照测试用例的步骤进行测试,只能

Selenium2 Python 自动化测试实战学习笔记(三)

4.9 多表单切换 在web应用中经常会遇到frame嵌套页面的应用,webdriver每次只能在一个页面上识别元素,对于frame嵌套的页面上的元素,直接定位是定位不到的,这时候就需要switch_to_frame()方法将当前定位的主体切换到frame里.Frame.htm:frame.htm, 直接定位百度的输入框一定会报找不到元素的错误.那么可以使用switch_to_frame()先找到frame.html 中的<iframe>标签,然后再定位百度输入框.switch_to_fram

Selenium2 Python 自动化测试实战学习笔记(九)

第十一章 Git代码管理项目 Git是一个开源的分布式版本控制住系统,用以有效.高速的处理从很小到非常大的项目版本管理. Git管理项目的方式有两种:一种是本地部署Git版本管理系统,另一种是通过在线的代码托管. 本地部署Git版本管理系统,需要自己搭建环境,但项目的提交与更新速度快,更适合比较封闭项目:在线托管最大的好处是在有网络的情况下可以随时随地的提交自己的代码,但项目是公开的,当然也可以创建私有项目,大多属于付费服务. 在代码托管服务器,GitHub无疑是最优秀的,其稳定性吸引了大批开发

Selenium2+Python自动化测试实战

本人在网上查找了很多做自动化的教程和实例,偶然的一个机会接触到了selenium,觉得非常好用.后来就在网上查阅各种selenium的教程,但是网上的东西真的是太多了,以至于很多东西参考完后无法系统的学习和应用,有一次在网上随意搜索,找到了-虫师-写的<Selenium2自动化测试实战基于Python语言>,觉得真心不错,内容也很调理,为了方便自己学习和知识的整理,就把其中虫师编写的自动化项目教程整理一下,有兴趣的可以去参看虫师的博客http://www.cnblogs.com/fnng/ 以

《selenium2 python 自动化测试实战》(5)——键盘事件

键盘事件,就是键盘上的一些操作,比如Ctrl +C,Ctrl+V,Ctrl+X等. 对键盘的操作需要导入另一个键盘的库: from selenium.webdriver.common.keys import Keys 举个例子,你要在搜索框输入"自动化测试",但是现在又想搜"自动化测",就是删掉一个字,我们知道,就是摁一下键盘上的Backspace键就可以了,这时候你就需要键盘操作了: driver.find_element_by_xpath("xpath

《selenium2 python 自动化测试实战》(8)——定位iframe

我们来看一段最早的代码: # coding: utf-8 from selenium import webdriverfrom time import sleep driver = webdriver.Firefox() driver.get("http://blog.hexun.com/") driver.find_element_by_id("read_btn").click() driver.maximize_window() sleep(3)driver.f

《selenium2 python 自动化测试实战》(9)——切换窗口

有时候我们点击按钮后页面会跳转到新的窗口,我们需要到新的窗口中去进行接下来的操作,这时候就需要切换窗口的操作,我们根据句柄(handle)来操作窗口之间的切换,看代码: # coding: utf-8from selenium import webdriverfrom time import sleep driver = webdriver.Firefox() driver.get("http://www.jrj.com.cn/") driver.find_element_by_xpa

《selenium2 python 自动化测试实战》(11)——selenium安装版本

先和大家说一下selenium环境的问题,大家可以在cmd里先看一下自己的selenium版本: 回车,就可以安装了. 本来想和大家说如何跳过验证码进行登录的,结果好多朋友加我问我环境配置的问题,所以觉得还是和大家详细的说明一下,我也自己做一下记录.大家可以提前看一下跳过验证码登录的问题.大家需要下载fiddler,一个很好用的工具,如果你在做手机App测试,应该很了解fiddler,因为需要用fiddler配置手机代理. 微信公众号搜索"自动化测试实战"或扫描下方二维码添加关注~~~