Python+Selenium做自动化测试(超详细整理)

一、项目介绍

目的

测试某官方网站登录功能模块可以正常使用【文末有配套视频教程和免费的资料文档领取】

用例

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

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

同时,在这我为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以直接【点击文末小卡片免费领取资料文档】

软件测试视频教程观看处:

【2024最新版】Python自动化测试15天从入门到精通,10个项目实战,允许白嫖。。。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV-Python(34):FAST算法

目标 理解 FAST 算法的基础使用OpenCV 中的FAST 算法相关函数进行角点检测 介绍 FAST算法(Features from Accelerated Segment Test)是一种用于在图像中快速检测角点的算法。它是一种基于像素的检测方法,具有高效、准确的特点,常…

【小程序开发需要多少钱?】

哈喽,大家好,这里是智创开发。 我们今天聊聊开发一个小程序需要多少钱。 由于自己组建团队来开发小程序成本过高,大品牌的企业一般都不会这么搞,所以我们今天只谈假如我有需求,找服务商来全程搞定的费用大致是多少。和…

关于镜头选型时的一些注意事项

1、问题背景 最近的项目调试过程中,遇到与镜头相关的问题比较多。所以本文主要总结一下镜头选型时需注意的事项,保证在项目前期就能规避掉一些问题,避免项目延期。 2、问题分析 我们拿到手的一般都是摄像头模组,在进行摄像头调试时…

java+ssm+vue代码视频学习讲解

一、ssm 1.项目文件结构 2.数据库连接信息 3.其他配置信息 4.java代码文件目录介绍 5.entity层代码 6.controller,service,dao,entity层之间的关系 7.controller层代码 8.登陆拦截功能实现 AuthorizationInterceptor.java 9.文件上传功能 …

日志审计系统Agent项目创建——获取Linux的ip并将得到的日志插入数据库中(Linux版本)

上一篇文章可以直接展示系统在运行过程中的日志,读取日志文件https://blog.csdn.net/wjl990316fddwjl/article/details/135553685 如何将得到的日志插入数据表中,进行更可观的展示? 1、创建表格并执行,可以看到数据库已经创建好…

paypal贝宝怎么绑卡支付

一、PayPal是什么 PayPal是一个很多国家地区通用的支付渠道,我们可以把它理解为一项在线服务,相当于美国版的支付宝。你可以通过PayPal进行汇款和收款,相比传统的电汇和西联那类的汇款方式,PayPal更加简单和容易,被很…

使用ffmpeg对视频进行静音检测

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-sta…

Retinal Structure Detection in OCTA Image viaVoting-Based Multitask Learning

一、摘要 研究背景:自动检测视网膜结构,如视网膜血管(RV)、中央凹血管区(FAZ)和视网膜血管连接(RVJ),对了解眼部疾病和临床决策具有重要意义。 主要工作:在本文中,提出了一种新的基于投票的自适应特征融合多任务网络…

Spring之AOP源码(二)

书接上文 文章目录 一、简介1. 前文回顾2. 知识点补充 二、ProxyFactory源码分析1. ProxyFactory2. JdkDynamicAopProxy3. ObjenesisCglibAopProxy 三、 Spring AOP源码分析 一、简介 1. 前文回顾 前面我们已经介绍了AOP的基本使用方法以及基本原理,但是还没有涉…

SQL注入攻击

1.用java实现登录的检查 package jdbc1;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Scanner;public class Login {public static void main(String args[]){try(Connection connec…

新型的变现和引流方式

AI 数字人短视频正成为一种新型的变现和引流方式。随着人工智能技术的不断发展,数字人技术也越来越成熟,为用户提供了更加逼真、生动的虚拟形象。通过AI 数字人短视频,用户可以创作出具有个性化特点的短视频内容,并将其发布在各大…

PLC控制脉冲轴绝对位置往复运动(三菱FX系列简单状态机编程)

有关状态机的具体介绍,专栏有很多文章,大家可以通过下面的链接查看: https://rxxw-control.blog.csdn.net/article/details/125488089https://rxxw-control.blog.csdn.net/article/details/125488089三菱FX系列回原功能块介绍 https://rxxw-control.blog.csdn.net/article…

在vue3和上挂载方法,以及在页面中怎么使用原型(公共)上的方法

//新建的项目的main.js文件是这样的 //main.js 文件 //befor import { createApp } from vue; import App from ./App.vue;const app createApp(App); app.mount(#app);以下例子用于解释在vue3.0的main.js中挂载公共的方法(foo) //main.js 文件 //afte…

51-11 多模态论文串讲—VLMo 论文精读

VLMo: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts (NeurIPS 2022) VLMo 是一种多模态 Transformer 模型,从名字可以看得出来它是一种 Mixture-of-Modality-Experts (MoME),即混合多模态专家。怎么理解呢?主流 …

解决ELK日志收集中Logstash报错的关键步

ElK执行日志收集的时候logstash报错: Failed to execute action {:action>LogStash::PipelineAction::Create/pipeline_id:main, :exception>“LogStash::ConfigurationError”, :message>“Expected one of [^\r\n], “\r”, “\n” at line 88, column 4…

【深度学习每日小知识】Overfitting 过拟合

过拟合是机器学习(ML)中的常见问题,是指模型过于复杂,泛化能力较差的场景。当模型在有限数量的数据上进行训练,并且学习了特定于该特定数据集的模式,而不是适用于新的、看不见的数据的一般模式时&#xff0…

不用下载就可以使用的三个在线抠图网站

字图像处理技术的发展,抠图已经成为一项重要的技术。在许多情况下,我们需要将图片中的某一部分抠出来,例如将人物从背景中抠出,或者将产品从图片中抠出。传统的抠图方法需要使用专业的图像处理软件,如Photoshop等&…

22k+stars centos轻松搭建网盘的神器

说明: 系统:centos7 64 ip:192.168.168.107 目录 1.下载 2.安装 3.启动 4.测试 1.下载 根据系统下载 wget https://github.com/filebrowser/filebrowser/releases/download/v2.27.0/linux-amd64-filebrowser.tar.gz 2.安装 tar -zxvf linux-amd64-filebrowser.tar.gz…

Linux限制用户可用硬盘空间

为了防止某个用户占用大量资源导致其他用户无法正常使用,一般会对单个用户可占用资源进行限制。就磁盘限额,XFS文件系统原生支持目录级别的限制。ext文件系统不支持目录限制,曲线方式是限制用户的总占用空间。 本文介绍使用quota程序限制用户…

有没有可以拖拉拽生成一个低代码平台?

据我所知,低代码平台都能拖拉拽生成。作为一组数字技术工具平台,它能基于图形化拖拽、参数化配置等更为高效的方式,实现快速构建、数据编排、连接生态、中台服务等。通过少量代码或不用代码实现数字化转型中的场景应用创新。 到底啥是低代码&…