pythonselenium自动化测试实战项目

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

一.项目介绍
目的

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

用例

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

环境

Windows10 +Python3.6+selenium3.13+Pycharm

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

二.脚本设计
目的

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

脚本设计模式    

代码实现
项目目录结构   

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

  1. 1 #! user/bin/python

  2. 2 '''

  3. 3 代码说明:麦子学院登录模块自动化测试用例脚本

  4. 4 编写日期:

  5. 5 设置者:linux超

  6. 6 '''

  7. 7

  8. 8 import time

  9. 9 from selenium import webdriver

  10. 10 from webinfo import webinfo

  11. 11 from userinfo import userinfo

  12. 12 from log_fiile import login_log

  13. 13 from pathlib import Path

  14. 14

  15. 15 def open_web():

  16. 16 driver = webdriver.Firefox()

  17. 17 driver.maximize_window()

  18. 18 return driver

  19. 19

  20. 20 def load_url(driver,ele_dict):

  21. 21 driver.get(ele_dict['Turl'])

  22. 22 time.sleep(5)

  23. 23

  24. 24 def find_element(driver,ele_dict):

  25. 25 # find element

  26. 26 driver.find_element_by_class_name(ele_dict['image_id']).click()

  27. 27 if 'text_id' in ele_dict:

  28. 28 driver.find_element_by_link_text('登录').click()

  29. 29

  30. 30 user_id = driver.find_element_by_id(ele_dict['userid'])

  31. 31 pwd_id = driver.find_element_by_id(ele_dict['pwdid'])

  32. 32 login_id = driver.find_element_by_id(ele_dict['loginid'])

  33. 33 return user_id,pwd_id,login_id

  34. 34

  35. 35 def send_val(ele_tuple,arg):

  36. 36 # input userinfo

  37. 37 listkey = ['uname','pwd']

  38. 38 i = 0

  39. 39 for key in listkey:

  40. 40 ele_tuple[i].send_keys('')

  41. 41 ele_tuple[i].clear()

  42. 42 ele_tuple[i].send_keys(arg[key])

  43. 43 i+=1

  44. 44 ele_tuple[2].click()

  45. 45 def check_login(driver,ele_dict,log,userlist):

  46. 46 result = False

  47. 47 time.sleep(3)

  48. 48 try:

  49. 49 err = driver.find_element_by_id(ele_dict['error'])

  50. 50 driver.save_screenshot(err.text+'.png')

  51. 51 log.log_write('账号:%s 密码:%s 提示信息:%s:failed\n' %(userlist['uname'],userlist['pwd'],err.text))

  52. 52 print('username or password error')

  53. 53 except:

  54. 54 print('login success!')

  55. 55 log.log_write('账号:%s 密码:%s :passed\n'%(userlist['uname'],userlist['pwd']))

  56. 56 #login_out(driver,ele_dict)

  57. 57 return True

  58. 58 return result

  59. 59 def login_out(driver,ele_dict):

  60. 60 driver.find_element_by_class_name(ele_dict['logout']).click()

  61. 61 '''

  62. 62 def screen_shot(err):

  63. 63 i = 0

  64. 64 save_path = r'D:\pythondcode\capture'

  65. 65 capturename = '\\'+str(i)+'.png'

  66. 66 wholepath = save_path+capturename

  67. 67 if Path(save_path).is_dir():

  68. 68 pass

  69. 69 else:

  70. 70 Path(save_path).mkdir()

  71. 71 while Path(save_path).exists():

  72. 72 i+=1

  73. 73 capturename = '\\'+str(i)+'.png'

  74. 74 wholepath = save_path + capturename

  75. 75 err.screenshot(wholepath)

  76. 76 '''

  77. 77 def login_test():

  78. 78 log = login_log()

  79. 79 #ele_dict = {'url': 'http://www.maiziedu.com/', 'text_id': '登录', 'user_id': 'id_account_l', 'pwd_id': 'id_password_l'

  80. 80 #, 'login_id': 'login_btn','image_id':'close-windows-btn7','error_id':'login-form-tips'}

  81. 81 ele_dict = webinfo(r'D:\pythoncode\webinfo.txt')

  82. 82 #user_list=[{'uname':account,'pwd':pwd}]

  83. 83 user_list = userinfo(r'D:\pythoncode\userinfo.txt')

  84. 84 driver = open_web()

  85. 85 # load url

  86. 86 load_url(driver,ele_dict)

  87. 87 #find element

  88. 88 ele_tuple = find_element(driver,ele_dict)

  89. 89 # send values

  90. 90 ftitle = time.strftime('%Y-%m-%d', time.gmtime())

  91. 91 log.log_write('\t\t\t%s登录系统测试报告\n' % (ftitle))

  92. 92 for userlist in user_list:

  93. 93 send_val(ele_tuple,userlist)

  94. 94 # check login success or failed

  95. 95 result = check_login(driver,ele_dict,log,userlist)

  96. 96 if result:

  97. 97 login_out(driver,ele_dict)

  98. 98 time.sleep(3)

  99. 99 ele_tuple = find_element(driver,ele_dict)

  100. 100 time.sleep(3)

  101. 101 log.log_close()

  102. 102 driver.quit()

  103. 103

  104. 104 if __name__ == '__main__':

  105. 105 login_test()

  1. 1 #! user/bin/python

  2. 2 '''

  3. 3 代码说明:从文本文档中读取用户信息

  4. 4 编写日期:

  5. 5 设置者:linux超

  6. 6 '''

  7. 7

  8. 8 import codecs

  9. 9

  10. 10 def userinfo(path):

  11. 11 file = codecs.open(path,'r','utf-8')

  12. 12 user_list = []

  13. 13 for line in file:

  14. 14 user_dict = {}

  15. 15 result = [ele.strip() for ele in line.split(';')]

  16. 16 for sult in result:

  17. 17 re_sult = [ele.strip() for ele in sult.split('=')]

  18. 18 user_dict.update(dict([re_sult]))

  19. 19 user_list.append(user_dict)

  20. 20 return user_list

  21. 21

  22. 22 if __name__ == '__main__':

  23. 23 user_list = userinfo(r'D:\pythoncode\userinfo.txt')

  24. 24 print(user_list)

  1. 1 #! user/bin/python

  2. 2 '''

  3. 3 代码说明:从文本文档中读取web元素

  4. 4 编写日期:

  5. 5 设置者:linux超

  6. 6 '''

  7. 7

  8. 8 import codecs

  9. 9

  10. 10 def webinfo(path):

  11. 11 file = codecs.open(path,'r','gbk')

  12. 12 ele_dict = {}

  13. 13 for line in file:

  14. 14 result = [ele.strip() for ele in line.split('=')]

  15. 15 ele_dict.update(dict([result]))

  16. 16 return ele_dict

  17. 17

  18. 18 if __name__ == '__main__':

  19. 19 ele_dict = webinfo(r'D:\pythoncode\webinfo.txt')

  20. 20 for key in ele_dict:

  21. 21 print(key,ele_dict[key])

  1. 1 #! user/bin/python

  2. 2 '''

  3. 3 代码说明:测试输出报告

  4. 4 编写日期:

  5. 5 设置者:linux超

  6. 6 '''

  7. 7

  8. 8 import time

  9. 9

  10. 10 class login_log(object):

  11. 11 def __init__(self,path='',mode='w'):

  12. 12 filename = path + time.strftime('%Y-%m-%d',time.gmtime())

  13. 13 self.log = open(path+filename+'.txt',mode)

  14. 14 def log_write(self,msg):

  15. 15 self.log.write(msg)

  16. 16 def log_close(self):

  17. 17 self.log.close()

  18. 18 if __name__ == '__main__':

  19. 19 log=login_log()

  20. 20 ftitle = time.strftime('%Y-%m-%d',time.gmtime())

  21. 21 log.log_write('xiaochao11520')

  22. 22 log.log_close()

  1. 1 uname=273839363@qq.com;pwd=xiaochao11520

  2. 2 uname=273839363;pwd=xiaochao11520

  3. 3 uname= ;pwd=xiaochao11520

  4. 4 uname=273839363@qq.com;pwd=

  5. 5 uname=2738;pwd=xiaochao

 
  1. 1 Turl=http://www.maiziedu.com/

  2. 2 text_id=登录

  3. 3 userid=id_account_l

  4. 4 pwdid=id_password_l

  5. 5 loginid=login_btn

  6. 6 error=login-form-tips

  7. 7 logout=sign_out

  8. 8 image_id=close-windows-btn7

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试经典 | 150】单词拆分

文章目录 Tag题目来源解题思路方法一:动态规划 写在最后 Tag 【动态规划】【字符串】 题目来源 139. 单词拆分 解题思路 方法一:动态规划 定义状态 定义 dp[i] 表示字符串 s 前 i 个字符组成的字符串(s[0, ..., i-1])是否能被…

【Node.js】模块化

概述 Nodejs 模块化规范遵循两套规范: Common JSES Module Common JS 引入模块(require)支持四种格式 支持引入内置模块例如 http os fs child_process 等const fs require(fs),高版本也可以使用const fs require(node:fs…

【Java SE】封装

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 封装1.1 封装是什么1.2 封装的意义1.3 访问修饰限定符1.3.1 在Java中如何实现封装1.3.2 各种访问修饰限定…

C语言基础:数据类型

数据类型 C 语言的每一种数据,都是有类型(type)的,编译器必须知道数据的类型,才能操作数据。一旦知道某个值的数据类型,就能知道该值的特征和操作方式。 基本数据类型有三种:字符(c…

C语言学习笔记day16

1. 可变参函数 在 C 语言中&#xff0c;可变参数函数是指能够接受不定数量参数的函数。常见的可变参数函数格式是使用 <stdarg.h> 头文件中的宏和函数来实现&#xff0c;其中最常用的是 va_list、va_start、va_arg 和 va_end 函数调用时,传入参数个数是不确定的,需要将函…

SpringCloud微服务集成Dubbo

1、Dubbo介绍 Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服…

【二叉树】Leetcode 230. 二叉搜索树中第K小的元素【中等】

二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1 解…

在 fstab文件中配置 UUID方式自动挂载数据盘、swap、目录(**)

linux如何挂在硬盘&#xff0c;自动挂载和手动挂载&#xff08;详细说明&#xff09;https://gitcode.csdn.net/65eedcea1a836825ed7a06f4.html 解决linux重启后磁盘挂载失效的问题 https://blog.csdn.net/sugarbliss/article/details/107033034 linux /etc/fstab 文件详细说…

UG NX二次开发(C#)-通过曲线组生成NURBS曲面

文章目录 1、前言2、UG NX中通过曲线组生成NURBS曲面的操作3、采用NXOpen C#方法的源代码1、前言 在UG NX中,曲线、曲面的操作使用比较多,对于创建NURBS曲面,可以通过曲线组来生成,本文以NXOpen C#的方法实现通过曲线组生成NURBS曲面的功能。对于UG NX二次开发感兴趣或者有…

探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较

title: 探索多种数据格式&#xff1a;JSON、YAML、XML、CSV等数据格式详解与比较 date: 2024/3/28 17:34:03 updated: 2024/3/28 17:34:03 tags: 数据格式JSONYAMLXMLCSV数据交换格式比较 1. 数据格式介绍 数据格式是用于组织和存储数据的规范化结构&#xff0c;不同的数据格…

【aws】架构图工具推荐

碎碎念 以前以为日本冰箱论是个梗&#xff0c;结果居然是真的。用光盘传真其实还能理解&#xff08;毕竟我也喜欢电子古董2333&#xff09;&#xff0c;但是画架构图居然用的是excel&#xff0b;截图&#xff01;啊苍天呐&#xff0c;然后看到隔壁工位用excel画web原型又感觉释…

将数字城市复制到虚拟空间,如何搭建实景三维虚拟场景?

什么是实景三维&#xff1f; 实景三维&#xff08;3D Real Scene&#xff09;是一个专业术语&#xff0c;它指的是对一定范围内人类生产、生活和生态空间进行真实、立体、时序化反映和表达的数字虚拟空间。它是新型基础测绘的标准化产品&#xff0c;也是国家重要的新型基础设施…

android apk混淆

android apk混淆是什么? Android APK 混淆是指对 Android 应用程序的代码进行混淆处理&#xff0c;以增强代码的安全性和减小应用程序体积。在 Android 开发中&#xff0c;通常使用 ProGuard 或 R8 这样的工具来执行混淆操作。 混淆过程通过重命名类、方法和变量名称&#x…

权限提升-系统权限提升篇数据库提权PostsqlRedis第三方软件提权密码凭据钓鱼文件

知识点 1、数据库到Linux-数据库提权-Redis 3、数据库到Linux-数据库提权-PostgreSQL 4、计算机用户到系统-第三方软件-各类应用 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 Windows提权&#xff1a; 1、…

RC522 读卡

Rc522对时序的要求很高&#xff0c;不能太快了&#xff0c;太快了它反应不过来&#xff0c;还有对硬件要求&#xff0c;线圈的长度等都会导致不灵敏&#xff0c;这个要调电容。下面这大哥说的很清楚。 RC522的天线设计和参考示例_rc522天线计算-CSDN博客 RC522.c #include &q…

Linux 基于HAProxy+KeepAlived实现

Linux 基于HAProxyKeepAlived实现 1. 介绍1.1 高可用&#xff08;HA-High Avaialbility&#xff09;1.2 负载均衡&#xff08;LB-Load Balance&#xff09;1.3 HAProxy1.4 KeepAlived 2. 后端服务为Nginx2.1 系统拓扑2.2 环境说明2.3 前提条件2.4 详细步骤2.4.1 机器初始化2.4.…

Python列表、元组、字典及集合

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、列表定义方式&#xff1a; 二、元组1、定义方式&#xff1a;2、元组中的物理存储地址不可修改,如果修改则会报错&#xff0c;但是元组中的列表、字典项等却可以…

双非二本找实习前的准备day11

学习目标&#xff1a; 每天2-3到简单sql&#xff08;刷完即止&#xff09;&#xff0c;每天复习代码随想录上的题目2-3道算法&#xff08;时间充足可以继续&#xff09;&#xff0c;背诵的八股的问题也在这里记录了 今日碎碎念&#xff1a; 1&#xff09;科四没时间考了&…

Retelling|Father Christmas

Father Christmas Retelling|Father Christmas Im going Im going to talk about Christmas and the question of whether he exists or not, all children would answer to this question. They all believe in Father Christmas. But 英 /ˈdʌlt&#xff0c;əˈdʌlt/a do…

高效八股文背诵方法

往往到了找工作高峰期&#xff0c;经常会出现八股文很多 难以背诵 的苦恼&#xff0c;下面在下结合情况&#xff0c;列举了几点自认为可以的背诵方法&#xff1a; 1. **大声朗读**&#xff1a; - 对于Java核心概念和重要理论&#xff0c;先大声朗读&#xff0c;这不仅可以帮…