python3.6+selenium3.13 自动化测试项目实战一(增加自动发送邮件报告接口)
说明
继实第一个实战项目的基础上添加自动发送报告邮件接口,代码有部分调整
变动
1.增加文本文档SendToUserinfo.txt 用来保存邮件接收者的信息
2.修改测试报告文件名称格式并添加reprot目录保存测试报告
3.添加代码注释,更方便阅读
项目目录
代码
修改过的代码直接贴上,没修改的代码就不贴了,可以去实战一直接拿过来用就ok
#! user/bin/python
'''
代码说明:麦子学院登录模块自动化测试用例脚本
编写日期:
设置者:linux超
''' import time
from selenium import webdriver
from webinfo import webinfo
from userinfo import userinfo
from log_fiile import login_log
from send_email import send_mail_init_info,read_SendToUserinfo_file #account = '281754043@qq.com'
def open_web():
'''
:return:web句柄
'''
driver = webdriver.Firefox()
driver.maximize_window()
return driver def load_url(driver,ele_dict):
'''
:param driver: web主页面句柄
:param ele_dict: web信息字典(从文件中读取)
:return: 无
'''
driver.get(ele_dict['Turl'])
time.sleep(5) def find_element(driver,ele_dict):
'''
:param driver: web句柄
:param ele_dict: web信息字典(从文件中读取)
:return: 返回找到的元素
'''
driver.find_element_by_class_name(ele_dict['image_id']).click()
if 'text_id' in ele_dict:
driver.find_element_by_link_text('登录').click() user_id = driver.find_element_by_id(ele_dict['userid'])
pwd_id = driver.find_element_by_id(ele_dict['pwdid'])
login_id = driver.find_element_by_id(ele_dict['loginid'])
return user_id,pwd_id,login_id def send_val(ele_tuple,arg):
'''
:param ele_tuple: web元素
:param arg: 可变长参数,接收用户名和密码
:return: 无
'''
# input userinfo
listkey = ['uname','pwd']
i = 0
for key in listkey:
ele_tuple[i].send_keys('')
ele_tuple[i].clear()
ele_tuple[i].send_keys(arg[key])
i+=1
ele_tuple[2].click()
# 判断登录是否成功,并写入测试报告
def check_login(driver,ele_dict,log,userlist):
'''
:param driver: web句柄
:param ele_dict: 读取到的元素信息(文件中读到的)
:param log: login_log对象
:param userlist: 用户信息(文件中读取)
:return: False or Ture
'''
result = False
time.sleep(3)
try:
err = driver.find_element_by_id(ele_dict['error'])
driver.save_screenshot(err.text+'.png')
log.log_write('账号:%s 密码:%s 提示信息:%s:failed\n' %(userlist['uname'],userlist['pwd'],err.text)) print('username or password error')
except:
print('login success!')
log.log_write('账号:%s 密码:%s :passed\n'%(userlist['uname'],userlist['pwd']))
#login_out(driver,ele_dict)
return True
return result
# 登出
def login_out(driver,ele_dict):
time.sleep(5)
driver.find_element_by_class_name(ele_dict['logout']).click()
'''
def screen_shot(err):
i = 0
save_path = r'D:\pythondcode\capture'
capturename = '\\'+str(i)+'.png'
wholepath = save_path+capturename
if Path(save_path).is_dir():
pass
else:
Path(save_path).mkdir()
while Path(save_path).exists():
i+=1
capturename = '\\'+str(i)+'.png'
wholepath = save_path + capturename
err.screenshot(wholepath)
''' def login_test():
log = login_log()
msg = read_SendToUserinfo_file(r'D:\pythoncode\login_test\SendToUserinfo.txt')
sendmail = send_mail_init_info('smtp.qq.com','281754043@qq.com','gifhhsbgqyovbhhc','281754043@qq.com',msg)
#ele_dict = {'url': 'http://www.maiziedu.com/', 'text_id': '登录', 'user_id': 'id_account_l', 'pwd_id': 'id_password_l'
#, 'login_id': 'login_btn','image_id':'close-windows-btn7','error_id':'login-form-tips'}
ele_dict = webinfo(r'D:\pythoncode\webinfo.txt')
#user_list=[{'uname':account,'pwd':pwd}]
user_list = userinfo(r'D:\pythoncode\userinfo.txt')
driver = open_web()
# load url
load_url(driver,ele_dict)
#find element
ele_tuple = find_element(driver,ele_dict)
# send values
ftitle = time.strftime('%Y-%m-%d', time.gmtime())
log.log_write('\t\t\t%s登录系统测试报告\n' % (ftitle))
# 循环用户测试数据
for userlist in user_list:
send_val(ele_tuple,userlist)
# check login success or failed
result = check_login(driver,ele_dict,log,userlist)
if result:
login_out(driver,ele_dict)
time.sleep(3)
ele_tuple = find_element(driver,ele_dict) time.sleep(3)
log.log_close() # 关闭log文件
# 发送报告到指定的邮箱
sendmail.send_email(log.filename)
driver.quit()
if __name__ == '__main__':
login_test()
login_test.py
#! user/bin/python
'''
代码说明:测试输出报告
编写日期:
设置者:linux超
''' import time
# 测试报告输出接口
class login_log(object):
filename = './report/' + time.strftime('%Y-%m-%d %H_%M_%S') + '.txt'
def __init__(self,path='./report/',mode='w'):
#filename = path + time.strftime('%Y-%m-%d %H_%M_%S') +'.txt'
self.log = open(self.filename,mode)
def log_write(self,msg):
self.log.write(msg)
def log_close(self):
self.log.close()
if __name__ == '__main__':
log=login_log()
log.log_write('xiaochao11520')
mas = log.filename
print(mas)
log.log_close()
log_fiile.py
#! user/bin/python
'''
代码说明:通过邮件发送测试报告
编写日期:2018.07.17
设置者:linux超
''' import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮件发送接口
class send_mail_init_info(object):
'''
邮件配置信息
'''
def __init__(self,server,fromuser,frompassword,sender,receiver):
self.server = server
self.fromuser = fromuser
self.frompassword = frompassword
self.sender = sender
self.receiver = receiver
'''
配置邮件发送者等信息
'''
def send_email(self,filename):
# 打开报告文件读取文件内容
#filename = './report/'+ time.strftime('%Y-%m-%d %H_%M_%S')
f = open(filename,'r')
file_msg = f.read()
print(filename)
print(file_msg)
f.close()
# 邮件服务器
smtpserver = self.server
# 发件人用户名和密码
user = self.fromuser
password = self.frompassword
# 发件人
sender = self.sender
# 收件人
receiver = self.receiver
# 邮件主题
subject = 'Python test report' #+ filename
# 邮件设置
msg = MIMEText(file_msg,'html','utf-8')
msg['subject'] = Header(subject,'utf-8')
msg['from'] = sender
# 连接服务器,登录服务器,发送邮件
self.smtp = smtplib.SMTP()
self.smtp.connect(smtpserver)
self.smtp.login(user,password)
try:
self.smtp.sendmail(sender, receiver, msg.as_string())
except Exception as e:
print('send failed', e)
else:
print('send success!')
def __del__(self):
self.smtp.quit()
# 从文件中读取邮件接收人信息
def read_SendToUserinfo_file(filename):
'''
:param filename: 读取接收邮件人信息
:return: 接手邮件人信息
'''
open_file = open(filename)
read_msg = open_file.read()
return read_msg
if __name__ == '__main__':
#send_email('./report/2018-07-16 13_09_21.txt')
read_msg=read_SendToUserinfo_file(r'D:\pythoncode\login_test\SendToUserinfo.txt')
sendmail = send_mail_init_info('smtp.qq.com','281754043@qq.com','gifhhsbgqyovbhhc','281754043@qq.com',read_msg)
sendmail.send_email('./report/2018-07-16 13_09_21.txt')
send_email.py
刚测试这里面的def read_SendToUserinfo_file(filename) 方法有点问题,现在修改一下,如下:
def read_SendToUserinfo_file(filename):
'''
:param filename: 读取接收邮件人信息
:return: 接手邮件人信息
'''
open_file = open(filename)
#read_msg = open_file.read()
#return read_msg
for line in open_file:
msg = [i.strip() for i in line.split(',')]
print(msg)
return msg
281754043@qq.com,486668776@qq.com
SendToUserinfo.txt
总结
目前这个小项目所有最基本的功能都有了 , 我会慢慢的再完善,毕竟是学习,希望把它完善的越来越好,自己动手知识记得的牢固一点
python3.6+selenium3.13 自动化测试项目实战一(增加自动发送邮件报告接口)的更多相关文章
- python3.6+selenium3.13 自动化测试项目实战一
自己亲自写的第一个小项目,学了几天写出来的一个小模块,可能还不是很完美,但是还算可以了,初学者看看还是很有用的,代码注释不是很多,有问题可以加我QQ 281754043 一.项目介绍 目的: 测试某官 ...
- 虫师Selenium2+Python_11、自动化测试项目实战
P276 11.1.3 自动化测试用例编写原则 在编写自动化测试用例过程中应该遵循以下原则: 1.一个用例为一个完整的场景,从用户登录系统到最终退出并关闭浏览器: 2.一个用例只能验证一个功能点,不要 ...
- 项目实战:JSP应用开发_接口:接口的实现
在类的声明中使用implements关键字来实现接口,一个类可以同时实现多个接口,各接口间用“,”隔开. class classname implements interfacename{ //重 ...
- koa 项目实战(三)创建测试接口和用户模型
1.创建测试接口,并引入用户模型 根目录/routes/api/users.js const Router = require('koa-router'); const router = new Ro ...
- 移动端自动化测试Appium 从入门到项目实战Python版☝☝☝
移动端自动化测试Appium 从入门到项目实战Python版 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 说到APP自动化测试,Appium可是说是非常流 ...
- 移动端自动化测试appium 从入门到项目实战Python版✍✍✍
移动端自动化测试appium 从入门到项目实战Python版 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程 ...
- 移动端自动化测试Appium 从入门到项目实战Python版
移动端自动化测试Appium 从入门到项目实战Python版 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...
- 项目实战13—企业级虚拟化Virtualization-KVM技术
项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html KVM的介绍.准备工作和qemu-kvm 命令详解 1.介绍 (1)介绍 KVM:就 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-13基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...
随机推荐
- 配置phpstorm自动上传代码
本地的项目目录是 D:\www\guandan 虚拟机上的项目目录是 /var/www/guandan
- 在腾讯云(windows)上搭建node.js服务器
1:安装Node.js 使用MSI文件,并按照提示安装node.js,默认情况下,安装程序将 Node.js 发行到 C:\Program Files\nodejs. 但这里我们需要修改安装路径到:D ...
- Struts2(一)---struts2的环境搭建及实例
刚刚接触struts2,有点懵懵懂懂,还是习惯于先写代码,然后慢慢来理解其中的思想. 这篇文章主要内容是strusts的环境搭建及通过一个简单的例子来理解到底是怎么使用struts来简化编程的. 1. ...
- Effective java-对象的创建和销毁
说到java对象的创建,首先应该提下java的内存机制,最主要的两块应该就是堆内存和栈内存. 简单点来说栈内存主要是保存基本数据类型的值和保存引用变量,堆内存主要用来存放new产生的对象,数组. 堆是 ...
- python之12306自动查票
一.导读 本篇文章所采用的技术仅用于学习.研究,任何其他用途请自行承担后果. 12306自动查票使用到的python库主要是splinter,同时也涉及到查票的城市编码,具体的城市编码请在网络上搜 ...
- 关于Kafka __consumer_offests的讨论
众所周知,__consumer__offsets是一个内部topic,对用户而言是透明的,除了它的数据文件以及偶尔在日志中出现这两点之外,用户一般是感觉不到这个topic的.不过我们的确知道它保存的是 ...
- 使用istream迭代器来输入输出数据
在C++中,很多人都会选择使用cin来进行数据的输入,使用cout来进行数据的输出,现在在C++11中我们可以使用iostream迭代器来进行这些操作,这会减少代码量,达到的效果和前面两种相同.以下是 ...
- [codeforces 804F. Fake bullions]
题目大意: 传送门. 给一个n个点的有向完全图(即任意两点有且仅有一条有向边). 每一个点上有$S_i$个人,开始时其中有些人有真金块,有些人没有金块.当时刻$i$时,若$u$到$v$有边,若$u$中 ...
- ES6知识整理(1)--let和const命令
最近准备在业余空闲时间里一边学习ES6,一边整理相关知识.只有整理过的学习才是有效的学习.也就是学习之后要使用和整理成文,才是正在的学到了... 那么现在开始 LINK START!(首先是第一讲,前 ...
- linux内核参数注释与优化
目录 1.linux内核参数注释 2.两种修改内核参数方法 3.内核优化参数生产配置 参数解释由网络上收集整理,常用优化参数对比了网上多个实际应用进行表格化整理,使查看更直观. 学习linux也有不少 ...