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 各种访问修饰限定…

SpringCloud微服务集成Dubbo

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

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

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

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

linux如何挂在硬盘,自动挂载和手动挂载(详细说明)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: 探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较 date: 2024/3/28 17:34:03 updated: 2024/3/28 17:34:03 tags: 数据格式JSONYAMLXMLCSV数据交换格式比较 1. 数据格式介绍 数据格式是用于组织和存储数据的规范化结构,不同的数据格…

【aws】架构图工具推荐

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

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

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

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

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

Linux 基于HAProxy+KeepAlived实现

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

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

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

React-1-jsx基础-事件绑定-样式处理

一.JSX基础-概念和本质 1.1 什么是JSX JSX是JavaScript和XML(HTML)的缩写,表示在JS代码中编写HTML模版结构,它是React中编写UI模版的方式 优势: 1. HTML的声明式模版写法 2. JS的可编程能力 JSX的本质: JSX并不是标…

vivado 手动布线

手动路由 手动路由允许您为网络选择特定的路由资源。这给了你对信号将要采用的路由路径的完全控制。手动路由不调用route_design。路线在路线数据库中直接更新。当您想精确控制网络的延迟时,可能需要使用手动路由。对于例如,假设有一个源同步接口&#…

如何查看JVM使用的是什么垃圾收集器

文章目录 一、背景分析二、查看垃圾收集器三、理解的偏差四、深挖 demo 代码五、总结 一、背景分析 无论讨论对象的内存分配,还是讨论内存的回收策略或是算法,都需要明确指出是基于哪种垃圾收集器进行的讨论。所以,很自然地就想到这个问题&a…

脱敏技术!!!

什么是数据脱敏??? 数据脱敏(Data Masking)是一种数据安全技术,旨在通过预先设定的规则和算法,对原始数据中包含的敏感信息进行变形处理,使得这些信息在非生产环境(例如…

考研数学|汤家凤1800基础部分要做完吗?

我教你一个方法,保证让你高质量的做完1800基础部分,而且还不用把所有题目都做了 我当然不是教你如何投机取巧,投机取巧是考不了高分的,我教你的都是我在实际考研过程中实际运用到的方法! 其实这个方法也是我在二战的时…

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 医院手麻系统源码

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 手术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统,其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配,再到术前访视、术中记录及术后…

面试题:Java虚拟机JVM的组成

1. 基础概念 JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行 自动内存管理,垃圾回收机制 JVM由哪些部分组成,运行流程是什么? …