python+selenium自动化测试项目实战

news2024/11/25 13:37:47

说明:本项目采用流程控制思想,未引用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()
 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)
 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])
 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()
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
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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

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

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

相关文章

想做交传翻译,如何成为一名专业的交传译员?

据了解,交传翻译指的是在会议进行过程中,译员快速地记录演讲者发言内容,在主讲者发言间隙,将上一段演讲内容翻译成目标语言并演讲个观众听。那么,如何成为一名专业的交传译员? 交传译员必须具备的能力有哪…

阿里云ubuntu服务器搭建ftp服务器

阿里云ubuntu服务器搭建ftp服务器 服务器环境安装步骤一.创建用户二.安装 vsftp三 配置vsftp四.配置阿里云安全组 服务器环境 阿里云上的云服务器,操作系统为 ubuntu20.04。 安装步骤 一.创建用户 为什么需要创建用户? 这里的用户,指的是…

Spring MVC入门必读:实现增删改查

目录 引言 一、前期准备 1.1.搭建Maven环境 1.2.导入pom.xml依赖 1.3.导入配置文件 ①jdbc.properties ②generatorConfig.xml ③log4j2.xml ④spring-mybatis.xml ⑤spring-context.xml ⑥spring-mvc.xml ⑦修改web.xml文件 二、逆向生成增删改查 2.1.导入相关u…

Visual Studio 2022 同步代码报错:Authentication failed...

1.使用其他git GUI工具,例如:TortoiseGit 能够正常拉取和推送项目, 但如果使用Visual Studio 2022 里面的git 代码管理工具拉取项目时,报错弹窗如下。 打开输出窗口,查看报错详细:点击Visual Studio 2022顶部菜单栏里…

win11和虚拟机上的ubuntu系统共享文件夹

出发点:有时候需要在虚拟机内和win11系统之间进行文件拷贝操作,但是虚拟机内的Vmware Tools不好用 解决方式 开启虚拟机共享文件夹 在虚拟机的Ubuntu系统内的终端命令行输入以下命令 sudo /usr/bin/vmhgfs-fuse .host:/SVMware /mnt/win -o subtype…

selenium 自动化测试:如何搭建自动化测试环境,搭建环境过程应该注意的问题

最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前的版本资料,对于有基础的人来说,3到4的差别虽然有,但是不足以影响自己,但是对于没有学过的人来说,通过资料再到自己写的…

2024年天津农学院专升本增加水文与水资源专业更名报考范围的通知

天津农学院2024年关于增加高职升本科“水文与水资源工程” 报考专业范围的通知 各位考生: 根据教育部《职业教育专业目录(2021年)》(教职成〔2021〕2号)相关内容要求,天津农学院专升本“水文与水资源工程”…

代码随想录算法训练营第45天 | ● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数11

文章目录 前言一、70. 爬楼梯 (进阶)二、322. 零钱兑换三、279.完全平方数总结 前言 完全背包; 一、70. 爬楼梯 (进阶) 第44天的blog里面有提到这个题目,本质上还是完全背包;另外,例…

spring-secrity的Filter顺序+自定义过滤器

Filter顺序 Spring Security的官方文档向我们提供了filter的顺序,实际应用中无论用到了哪些,整体的顺序是保持不变的: ChannelProcessingFilter,重定向到其他协议的过滤器。也就是说如果你访问的channel错了,那首先就会在channel…

【LeetCode-中等题】79. 单词搜索

文章目录 题目方法一:递归 回溯 题目 方法一:递归 回溯 需要一个标记数组 来标志格子字符是否被使用过了先找到word 的第一个字符在表格中的位置,再开始递归递归的结束条件是如果word递归到了最后一个字符了,说明能在矩阵中找到单…

学历低不能学编程?

最近,有小伙伴向小编提问:自己学历低是否可以学编程呢?围绕这个问题,相信也有不少小伙伴也有这个疑问,那就让我们一起来揭晓这个谜底吧! 答案是:当然可以!为什么呢? 首…

在线积分求解网站和求解举例

在线积分求解网站和求解举例 在进行复杂计算时,有时会遇到积分求解的问题,基于大学高数、积分变换、复变函数或者矩阵论等理论知识可以通过解析方式求解所遇到的积分问题。在这个求解过程中,能够清晰的理解积分求解基本知识和技巧。有时&…

macbook命令行乱码处理办法

作者:吴业亮 博客:wuyeliang.blog.csdn.net 1、设置编码 2、在终端下输入在这里插入代码片 vi ~/.zshrc在文件内容末端添加: export LC_ALLen_US.UTF-8 export LANGen_US.UTF-8最后再让设置生效 source ~/.zshrc

web请求cookie中expires总结

用意 cookie 有失效日期 "expires",如果还没有过失效期,即使重新启动电脑,cookie 仍然不会丢失 注意:如果没有指定 expires 值,那么在关闭浏览器时,cookie 即失效。 设置 如果cookie存储时间大…

【GO语言基础】变量常量

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 【GO语言基础】运算符 文章目录 系列文章目录常量和枚举变量声明全局变量声明大小写敏感 总结 常量和枚举 使用const关键字声明常量,并为每个常量提…

游戏平台加盟该怎么做?需要准备什么?

游戏平台加盟是一种合作模式,允许个人或企业以加盟商的身份参与游戏平台,并从中获得一定的权益和收益。以下是一些步骤和需要准备的事项,来考虑如何进行游戏平台加盟: 步骤: 研究市场和平台:了解游戏市场和…

【Python+selenium】自动化生成测试报告

批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。 unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一、入HTMLTe…

BMS电池管理系统——BMS的功能模块及基本要素(二)

BMS电池管理系统 文章目录 BMS电池管理系统前言一、BMS电池管理系统各个功能模块的关系二、BMS的边界及基本要素 前言 前面了解了BMS以及他的功能模块,这些功能模块之间的关系是什么呢? 一、BMS电池管理系统各个功能模块的关系 下面我们分析一下这张图…

Yolov8-pose关键点检测:模型轻量化创新 | ScConv结合c2f | CVPR2023

💡💡💡本文解决什么问题:ScConv(空间和通道重建卷积),一个即插即用的架构单元,可以可以直接用来替代各种卷积神经网络中的标准卷积。 ScConv | GFLOPs从9.6降低至9,参数量从6482kb降低至6479kb Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.net/m0_637742…

BLE Mesh蓝牙mesh网多跳大数据量高带宽传输数据方法

1、BLE Mesh数据传输现状 BLE Mesh网络技术是低功耗蓝牙的一个进阶版,Mesh扩大了蓝牙在应用中的规模和范围,因为它同时支持超过三万个网络节点,可以跨越大型建筑物,不仅可以使得医疗健康应用更加方便快捷,还能监测像学…