python3.6+selenium3.13 自动化测试项目实战一
说明:本项目采用流程控制思想,未引用unittest&pytest等单元测试框架
一.项目介绍
目的
测试某官方网站登录功能模块可以正常使用
用例
1.输入格式正确的用户名和正确的密码,验证是否登录成功;
2.输入格式正确的用户名和不正确的密码,验证是否登录失败,并且提示信息正确;
3.输入格式正确的用户名和任意密码,验证是否登录失败,并且提示信息正确;
4.用户名和密码两者都为空,验证是否登录失败,并且提示信息正确;
5.用户名和密码两者之一为空,验证是否登录失败,并且提示信息正确;
环境
Windows10 +Python3.6+selenium3.13+Pycharm
环境我想大多数人都会搭建,有事没事找百度,一搜一箩筐,哈哈!我自己刚学的时候也是各种问题各种百度,好在都解决了,感谢有度娘这么强大的存在!这里就不写环境怎么搭建了,直接进入主题
二.脚本设计
目的
我们的测试脚本需要达到:脚本可移植,脚本模块化,测试数据分离,输出测试报告 等目的
脚本设计模式

代码实现
项目目录结构

注:下面的文件存放在同一个目录下
#! 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 pathlib import Path def open_web():
driver = webdriver.Firefox()
driver.maximize_window()
return driver def load_url(driver,ele_dict):
driver.get(ele_dict['Turl'])
time.sleep(5) def find_element(driver,ele_dict):
# find element
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):
# 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):
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):
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()
#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()
driver.quit() if __name__ == '__main__':
login_test()
login_test.py
#! user/bin/python
'''
代码说明:从文本文档中读取用户信息
编写日期:
设置者:linux超
''' import codecs def userinfo(path):
file = codecs.open(path,'r','utf-8')
user_list = []
for line in file:
user_dict = {}
result = [ele.strip() for ele in line.split(';')]
for sult in result:
re_sult = [ele.strip() for ele in sult.split('=')]
user_dict.update(dict([re_sult]))
user_list.append(user_dict)
return user_list if __name__ == '__main__':
user_list = userinfo(r'D:\pythoncode\userinfo.txt')
print(user_list)
userinfo.py
#! user/bin/python
'''
代码说明:从文本文档中读取web元素
编写日期:
设置者:linux超
''' import codecs def webinfo(path):
file = codecs.open(path,'r','gbk')
ele_dict = {}
for line in file:
result = [ele.strip() for ele in line.split('=')]
ele_dict.update(dict([result]))
return ele_dict if __name__ == '__main__':
ele_dict = webinfo(r'D:\pythoncode\webinfo.txt')
for key in ele_dict:
print(key,ele_dict[key])
webinfo.py
#! user/bin/python
'''
代码说明:测试输出报告
编写日期:
设置者:linux超
''' import time class login_log(object):
def __init__(self,path='',mode='w'):
filename = path + time.strftime('%Y-%m-%d',time.gmtime())
self.log = open(path+filename+'.txt',mode)
def log_write(self,msg):
self.log.write(msg)
def log_close(self):
self.log.close()
if __name__ == '__main__':
log=login_log()
ftitle = time.strftime('%Y-%m-%d',time.gmtime())
log.log_write('xiaochao11520')
log.log_close()
log_file.py
uname=273839363@qq.com;pwd=xiaochao11520
uname=273839363;pwd=xiaochao11520
uname= ;pwd=xiaochao11520
uname=273839363@qq.com;pwd=
uname=2738;pwd=xiaochao
userinfo.txt
Turl=http://www.maiziedu.com/
text_id=登录
userid=id_account_l
pwdid=id_password_l
loginid=login_btn
error=login-form-tips
logout=sign_out
image_id=close-windows-btn7
webinfo.py
实在是不擅长写文章,写完感觉内容好少,其实这么一个小模块涉及到的知识还是挺多的,但是不知道该如何下手整理,想看的就对付看下把,实在抱歉!
python3.6+selenium3.13 自动化测试项目实战一的更多相关文章
- python3.6+selenium3.13 自动化测试项目实战一(增加自动发送邮件报告接口)
说明: 继实战项目一的基础上添加自动发送报告邮件接口,代码有部分调整,可以结合实战一和上篇文章学习 变动: 1.增加文本文档SendToUserinfo.txt 用来保存邮件接收者的信息 2.修改测试 ...
- miniFTP项目实战一
项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...
- 电子商务网站SQL注入项目实战一例
故事A段:发现整站SQL对外输出: 有个朋友的网站,由于是外包项目,深圳某公司开发的,某天我帮他检测了一下网站相关情况. 我查看了页面源代码,发现了个惊人的事情,竟然整站打印SQL到Html里,着实吓 ...
- Kaggle项目实战一:Titanic: Machine Learning from Disaster
项目地址 https://www.kaggle.com/c/titanic 项目介绍: 除了乘客的编号以外,还包括下表中10个字段,构成了数据的所有特征 Variable Definition Key ...
- docker自动化部署前端项目实战一
docker自动化部署前端项目实战一 本文适用于个人项目,如博客.静态文档,不涉及后台数据交互,以部署文档为例. 思路 利用服务器node脚本,监听github仓库webhook push事件触发po ...
- Tensorflow项目实战一:MNIST手写数字识别
此模型中,输入是28*28*1的图片,经过两个卷积层(卷积+池化)层之后,尺寸变为7*7*64,将最后一个卷积层展成一个以为向量,然后接两个全连接层,第一个全连接层加一个dropout,最后一个全连接 ...
- python 打飞机项目 (实战一)
第一步定义 main 函数: # -*- coding=utf-8 -*- import pygame,time from Plane import Plane from pygame.locals ...
- zookeeper curator ( 实战一)
目录 zookeeper 的伪集群搭建 写在前面 1.1. zookeeper 安装&配置 1.1.1. 创建数据目录和日志目录: 1.1.2. 创建myid文件 1.1.3. 创建和修改配置 ...
- 【转】Delphi+Halcon实战一:两行代码识别QR二维码
Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...
随机推荐
- Android SQLite 数据库学习
SQLite 数据库简介 SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本.它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需 ...
- Vue番外篇 -- vue-router浅析原理
近期被问到一个问题,在你们项目中使用的是Vue的SPA(单页面)还是Vue的多页面设计? 这篇文章主要围绕Vue的SPA单页面设计展开. 关于如何展开Vue多页面设计请点击查看. 官网vue-rout ...
- 【JavaScript动画基础】学习笔记(一)-- 旋转箭头
随着鼠标的移动旋转箭头. requestAnimationFrame 在requestAnimationFrame之前我们可以用setInterval来实现动画的循环: function drawFr ...
- Android Studio导出JavaDoc时中文乱码问题解决
导出过程中,如果出现JavaDoc中文乱码的问题,可以在Other command line arguments栏目添加命令参数:-encoding UTF-8 -charset UTF-8(如果是G ...
- 基于Spring和Mybatis拦截器实现数据库操作读写分离
首先需要配置好数据库的主从同步: 上一篇文章中有写到:https://www.cnblogs.com/xuyiqing/p/10647133.html 为什么要进行读写分离呢? 通常的Web应用大多数 ...
- 区块链技术现状&前景
炒作周期 Gartner 在 2017 年发布的新兴技术炒作曲线,这张图是去年 8 月发布的,当时估计它们也没料到随后能有那么火,当时区块链在这个位置,其实是已经过了炒作的巅峰期,正在往低谷走的这个阶 ...
- 【Android Studio安装部署系列】四十二、Android Studio使用Eclipse中的keystore为App签名
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 从eclipse迁移到AndroidStudio,要用原Eclipse的签名文件,这样才能保证转到AndroidStudio后更新的 ...
- Docker Swarm搭建多服务器下Docker集群
对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑 ...
- 【Python3爬虫】为什么你的博客没人看呢?
我相信对于很多爱好和习惯写博客的人来说,如果自己的博客有很多人阅读和评论的话,自己会非常开心,但是你发现自己用心写的博客却没什么人看,多多少少会觉得有些伤心吧?我们今天就来看一下为什么你的博客没人看呢 ...
- 基于python脚本,实现Unity全平台的自动打包
转载请标明出处:http://www.cnblogs.com/zblade/ 0. 概述 本文主要针对项目中自动打包过程进行调研,实现用python脚本来打出win/android/ios三个平台下的 ...