说明:本项目采用流程控制思想,未引用unittest&pytest等单元测试框架

一.项目介绍

目的

测试某官方网站登录功能模块可以正常使用

用例

1.输入格式正确的用户名和正确的密码,验证是否登录成功;
2.输入格式正确的用户名和不正确的密码,验证是否登录失败,并且提示信息正确;
3.输入格式正确的用户名和任意密码,验证是否登录失败,并且提示信息正确;
4.用户名和密码两者都为空,验证是否登录失败,并且提示信息正确;
5.用户名和密码两者之一为空,验证是否登录失败,并且提示信息正确;

环境

Windows10 +Python3.6+selenium3.13+Pycharm

环境我想大多数人都会搭建,有事没事找百度,一搜一箩筐,哈哈!我自己刚学的时候也是各种问题各种百度,好在都解决了,感谢有度娘这么强大的存在!这里就不写环境怎么搭建了,直接进入主题

二.脚本设计

目的

我们的测试脚本需要达到:脚本可移植,脚本模块化,测试数据分离,输出测试报告 等目的

脚本设计模式

    

代码实现

项目目录结构

    

注:下面的文件存放在同一个目录下

  1. #! user/bin/python
  2. '''
  3. 代码说明:麦子学院登录模块自动化测试用例脚本
  4. 编写日期:
  5. 设置者:linux超
  6. '''
  7.  
  8. import time
  9. from selenium import webdriver
  10. from webinfo import webinfo
  11. from userinfo import userinfo
  12. from log_fiile import login_log
  13. from pathlib import Path
  14.  
  15. def open_web():
  16. driver = webdriver.Firefox()
  17. driver.maximize_window()
  18. return driver
  19.  
  20. def load_url(driver,ele_dict):
  21. driver.get(ele_dict['Turl'])
  22. time.sleep(5)
  23.  
  24. def find_element(driver,ele_dict):
  25. # find element
  26. driver.find_element_by_class_name(ele_dict['image_id']).click()
  27. if 'text_id' in ele_dict:
  28. driver.find_element_by_link_text('登录').click()
  29.  
  30. user_id = driver.find_element_by_id(ele_dict['userid'])
  31. pwd_id = driver.find_element_by_id(ele_dict['pwdid'])
  32. login_id = driver.find_element_by_id(ele_dict['loginid'])
  33. return user_id,pwd_id,login_id
  34.  
  35. def send_val(ele_tuple,arg):
  36. # input userinfo
  37. listkey = ['uname','pwd']
  38. i = 0
  39. for key in listkey:
  40. ele_tuple[i].send_keys('')
  41. ele_tuple[i].clear()
  42. ele_tuple[i].send_keys(arg[key])
  43. i+=1
  44. ele_tuple[2].click()
  45. def check_login(driver,ele_dict,log,userlist):
  46. result = False
  47. time.sleep(3)
  48. try:
  49. err = driver.find_element_by_id(ele_dict['error'])
  50. driver.save_screenshot(err.text+'.png')
  51. log.log_write('账号:%s 密码:%s 提示信息:%s:failed\n' %(userlist['uname'],userlist['pwd'],err.text))
  52. print('username or password error')
  53. except:
  54. print('login success!')
  55. log.log_write('账号:%s 密码:%s :passed\n'%(userlist['uname'],userlist['pwd']))
  56. #login_out(driver,ele_dict)
  57. return True
  58. return result
  59. def login_out(driver,ele_dict):
  60. driver.find_element_by_class_name(ele_dict['logout']).click()
  61. '''
  62. def screen_shot(err):
  63. i = 0
  64. save_path = r'D:\pythondcode\capture'
  65. capturename = '\\'+str(i)+'.png'
  66. wholepath = save_path+capturename
  67. if Path(save_path).is_dir():
  68. pass
  69. else:
  70. Path(save_path).mkdir()
  71. while Path(save_path).exists():
  72. i+=1
  73. capturename = '\\'+str(i)+'.png'
  74. wholepath = save_path + capturename
  75. err.screenshot(wholepath)
  76. '''
  77. def login_test():
  78. log = login_log()
  79. #ele_dict = {'url': 'http://www.maiziedu.com/', 'text_id': '登录', 'user_id': 'id_account_l', 'pwd_id': 'id_password_l'
  80. #, 'login_id': 'login_btn','image_id':'close-windows-btn7','error_id':'login-form-tips'}
  81. ele_dict = webinfo(r'D:\pythoncode\webinfo.txt')
  82. #user_list=[{'uname':account,'pwd':pwd}]
  83. user_list = userinfo(r'D:\pythoncode\userinfo.txt')
  84. driver = open_web()
  85. # load url
  86. load_url(driver,ele_dict)
  87. #find element
  88. ele_tuple = find_element(driver,ele_dict)
  89. # send values
  90. ftitle = time.strftime('%Y-%m-%d', time.gmtime())
  91. log.log_write('\t\t\t%s登录系统测试报告\n' % (ftitle))
  92. for userlist in user_list:
  93. send_val(ele_tuple,userlist)
  94. # check login success or failed
  95. result = check_login(driver,ele_dict,log,userlist)
  96. if result:
  97. login_out(driver,ele_dict)
  98. time.sleep(3)
  99. ele_tuple = find_element(driver,ele_dict)
  100. time.sleep(3)
  101. log.log_close()
  102. driver.quit()
  103.  
  104. if __name__ == '__main__':
  105. login_test()

login_test.py

  1. #! user/bin/python
  2. '''
  3. 代码说明:从文本文档中读取用户信息
  4. 编写日期:
  5. 设置者:linux超
  6. '''
  7.  
  8. import codecs
  9.  
  10. def userinfo(path):
  11. file = codecs.open(path,'r','utf-8')
  12. user_list = []
  13. for line in file:
  14. user_dict = {}
  15. result = [ele.strip() for ele in line.split(';')]
  16. for sult in result:
  17. re_sult = [ele.strip() for ele in sult.split('=')]
  18. user_dict.update(dict([re_sult]))
  19. user_list.append(user_dict)
  20. return user_list
  21.  
  22. if __name__ == '__main__':
  23. user_list = userinfo(r'D:\pythoncode\userinfo.txt')
  24. print(user_list)

userinfo.py

  1. #! user/bin/python
  2. '''
  3. 代码说明:从文本文档中读取web元素
  4. 编写日期:
  5. 设置者:linux超
  6. '''
  7.  
  8. import codecs
  9.  
  10. def webinfo(path):
  11. file = codecs.open(path,'r','gbk')
  12. ele_dict = {}
  13. for line in file:
  14. result = [ele.strip() for ele in line.split('=')]
  15. ele_dict.update(dict([result]))
  16. return ele_dict
  17.  
  18. if __name__ == '__main__':
  19. ele_dict = webinfo(r'D:\pythoncode\webinfo.txt')
  20. for key in ele_dict:
  21. print(key,ele_dict[key])

webinfo.py

  1. #! user/bin/python
  2. '''
  3. 代码说明:测试输出报告
  4. 编写日期:
  5. 设置者:linux超
  6. '''
  7.  
  8. import time
  9.  
  10. class login_log(object):
  11. def __init__(self,path='',mode='w'):
  12. filename = path + time.strftime('%Y-%m-%d',time.gmtime())
  13. self.log = open(path+filename+'.txt',mode)
  14. def log_write(self,msg):
  15. self.log.write(msg)
  16. def log_close(self):
  17. self.log.close()
  18. if __name__ == '__main__':
  19. log=login_log()
  20. ftitle = time.strftime('%Y-%m-%d',time.gmtime())
  21. log.log_write('xiaochao11520')
  22. log.log_close()

log_file.py

  1. uname=273839363@qq.com;pwd=xiaochao11520
  2. uname=273839363;pwd=xiaochao11520
  3. uname= ;pwd=xiaochao11520
  4. uname=273839363@qq.com;pwd=
  5. uname=2738;pwd=xiaochao

userinfo.txt

  1. Turl=http://www.maiziedu.com/
  2. text_id=登录
  3. userid=id_account_l
  4. pwdid=id_password_l
  5. loginid=login_btn
  6. error=login-form-tips
  7. logout=sign_out
  8. image_id=close-windows-btn7

webinfo.py

实在是不擅长写文章,写完感觉内容好少,其实这么一个小模块涉及到的知识还是挺多的,但是不知道该如何下手整理,想看的就对付看下把,实在抱歉!

python3.6+selenium3.13 自动化测试项目实战一的更多相关文章

  1. python3.6+selenium3.13 自动化测试项目实战一(增加自动发送邮件报告接口)

    说明: 继实战项目一的基础上添加自动发送报告邮件接口,代码有部分调整,可以结合实战一和上篇文章学习 变动: 1.增加文本文档SendToUserinfo.txt 用来保存邮件接收者的信息 2.修改测试 ...

  2. miniFTP项目实战一

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  3. 电子商务网站SQL注入项目实战一例

    故事A段:发现整站SQL对外输出: 有个朋友的网站,由于是外包项目,深圳某公司开发的,某天我帮他检测了一下网站相关情况. 我查看了页面源代码,发现了个惊人的事情,竟然整站打印SQL到Html里,着实吓 ...

  4. Kaggle项目实战一:Titanic: Machine Learning from Disaster

    项目地址 https://www.kaggle.com/c/titanic 项目介绍: 除了乘客的编号以外,还包括下表中10个字段,构成了数据的所有特征 Variable Definition Key ...

  5. docker自动化部署前端项目实战一

    docker自动化部署前端项目实战一 本文适用于个人项目,如博客.静态文档,不涉及后台数据交互,以部署文档为例. 思路 利用服务器node脚本,监听github仓库webhook push事件触发po ...

  6. Tensorflow项目实战一:MNIST手写数字识别

    此模型中,输入是28*28*1的图片,经过两个卷积层(卷积+池化)层之后,尺寸变为7*7*64,将最后一个卷积层展成一个以为向量,然后接两个全连接层,第一个全连接层加一个dropout,最后一个全连接 ...

  7. python 打飞机项目 (实战一)

    第一步定义 main 函数: # -*- coding=utf-8 -*- import pygame,time from Plane import Plane from pygame.locals ...

  8. zookeeper curator ( 实战一)

    目录 zookeeper 的伪集群搭建 写在前面 1.1. zookeeper 安装&配置 1.1.1. 创建数据目录和日志目录: 1.1.2. 创建myid文件 1.1.3. 创建和修改配置 ...

  9. 【转】Delphi+Halcon实战一:两行代码识别QR二维码

    Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...

随机推荐

  1. Android 插件化技术窥探

    在Android 插件化技术中(宿主app和插件app设置相同的sharedUserId),动态加载apk有两种方式: 一种是将资源主题包的apk安装到手机上再读取apk内的资源,这种方式的原理是将宿 ...

  2. 2017-10-31 中文代码示例教程之Vuejs入门&后续计划

    "中文编程"知乎专栏原链 为了检验中文命名在主流框架中的支持程度, 这里把vuejs官方入门教程第一部分的示例代码中尽量使用了中文命名. 过程中有一些发现, 初步看来Vuejs对中 ...

  3. MPP-使用说明

    1.介绍 MPP是瑞芯微提供的媒体处理软件平台,适用于瑞芯微芯片系列.它屏蔽了有关芯片的复杂底层处理,屏蔽了不同芯片的差异,为使用者提供了统一的视频媒体统一接口. 具体提供的功能: 视频编码:H264 ...

  4. SQL Server 查找统计信息的采样时间与采样比例

    有时候我们会遇到,由于统计信息不准确导致优化器生成了一个错误的执行计划(或者这样表达:一个较差的执行计划),从而引起了系统性能问题.那么如果我们怀疑这个错误的执行计划是由于统计信息不准确引起的.那么我 ...

  5. 织梦dedecms如何修改关键词的字数长度限制

    亲测,这个教程比较完善,百度了很多有些少步骤,或者方法根本不对,导致不成功.这个方法我亲子测试了.奏效. 首先登陆数据库后台,如phpmyadmin,找到相应的数据表dede_archives和ded ...

  6. Scanner类详解

    Scanner类用于获取键盘输入(是一个基于正则表达式的文本扫描器),它可以从文件.字符串.输入流中解析出基本类型值和字符串值.Scanner类提供了多个构造器,不同的构造器可以接收文件.字符串和输入 ...

  7. Yii2 解决2006 MySQL server has gone away问题

    Yii2 解决2006 MySQL server has gone away问题 Yii2版本 2.0.15.1 php后台任务经常包含多段sql,如果php脚本执行时间较长,或者sql执行时间较长, ...

  8. 网络协议 18 - CDN:家门口的小卖铺

    [前五篇]系列文章传送门: 网络协议 13 - HTTPS 协议:加密路上无尽头 网络协议 14 - 流媒体协议:要说爱你不容易 网络协议 15 - P2P 协议:小种子大学问 网络协议 16 - D ...

  9. 【TCP协议】(1)---TCP协议详解

    TCP协议 本文内容如下:      1)TCP协议概念      2)TCP头部结构和字段介绍      3)TCP流量控制            滑动窗口      4)TCP拥塞控制      ...

  10. qml demo分析(maskedmousearea-异形窗口)

    一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...