web自动化笔记(二)
文章目录
- 一、参数化测试
- 1.pytest命令
- 2.实现参数化测试
- 3.填写地址测试
- 4.生成Allure测试报告
- 5.关键字驱动
- 二、案例
- 1.实现后台登录
- 1.1登录
- 1.2.处理验证码
- 1.3.封装识别验证码函数
- 2.通过cookie保持登录
- 2.1给页面添加cookie
- 2.2获取页面的cookie
- 2.3自动化获取cookie
- 三、excel进行数据加载
- 1.安装第三方工具
- 2.封装函数
- 3.使用数据
- 注
一、参数化测试
对于相似的测试用例,实现代码重用,减少代码量,提高维护性。
让一份代码,执行多个用例,每组参数都独立执行一次。
1.pytest命令
#查看版本
pytest --version
#运行特定的测试函数
(1)显式指定函数名,通过::标记,比如命令pytest test_a.py::test_b,则只会运行test_a.py中的test_b函数
(2)使用模糊匹配,使用 -k 选项标识,比如命令pytest -k sqrt test_a.py
(3)使用pytest.mark在函数上进行标记。
#使用装饰器跳过指定的测试函数
@pytest.mark.skip()
#使用装饰器实现预见错误功能
@pytest.mark.xfail()
#参数
-v #输出详细信息
-m #选择标记的测试函数
2.实现参数化测试
import pytest
def test_a():print("这是一个测试用例")@pytest.mark.parametrize("i", #参数名range(5), #参数值
)
def test_b(i):print(f"这是{i}个测试用例")
3.填写地址测试
import pytest
from webdriver_helper import get_webdriverfrom pages import *
from test_a import driver#整个测试会话只执行一次
@pytest.fixture(scope='session')
def user_driver():#完成登录操作driver=get_webdriver()driver.maximize_window()driver.get('登录页面网址(自己填)')#login_page函数在上次已完成,在这里直接使用login_page=LoginPage(driver)login_page.login("账号","密码")assert login_page.msg.text =='登录成功'yield driverdriver.quit()@pytest.mark.parametrize("name,tel,sheng,shi,qu,address,msg"[["", "", "", "", "", "", "提示信息"],["姓名", "", "省", "市", "区", "地址", "提示信息"],["姓名", "电话", "", "市", "区", "地址", "提示信息"],["姓名", "电话", "省", "", "区", "地址", "提示信息"],["姓名", "电话", "省", "市", "", "地址", "提示信息"],["姓名", "电话", "省", "市", "区", "", "提示信息"],["姓名", "电话", "省", "市", "区", "地址", "操作成功"],],
)
def test_new_address(user_driver,name,tel,sheng,shi,qu,address,msg):user_driver.get("新增地址页面网址")page=AddressPage(user_driver)page.click_new()page.input_info(name,tel,sheng,shi,qu,address,)page.click_save()assert page.msg.text ==msg
4.生成Allure测试报告
安装
pip install allure-pytest
启用插件
创建pytest.ini文件
写入:[pytest]addopts= --alluredir=./.allure_resultslog_file_level =info
执行用例,生成结果
pytest
生成测试报告
截图
allure.attach(self._driver.get_screenshot_as_png(),)
5.关键字驱动
页面的样式和功能无线,但是用户操作有限,配合excel完成测试。
1.流程
1.1在excel列出用户动作(关键字)
2.框架读取,执行关键字
3.加载其他插件,实现并行测试,失败重试,HTML报告。
二、案例
1.实现后台登录
1.1登录
import time
from os import timesfrom selenium import webdriver
from selenium.webdriver.common.by import By#创建驱动对象
driver=webdriver.Chrome()
#访问被测页面
driver.get("网址")
#页面最大化
driver.maximize_window()
#登录
driver.find_element(By.XPATH,'账号的xpath').send_keys("账号")
driver.find_element(By.XPATH,'密码的xpath').send_keys("密码")
driver.find_element(By.XPATH,'验证码的xpath').send_keys("验证码")
driver.find_element(By.XPATH,'登录按钮xpath').click()
time.sleep(5)
#关闭驱动
driver.quit()
1.2.处理验证码
验证码常用处理方式:
(1)关闭验证码功能
(2)设置万能验证码
(3)通过第三方
3.1获取验证码图片:使用selenium提供的截图方法获取验证码图片。
3.2通过第三方接口发送请求识别验证码内容。
3.3从返回结果的字典中提取验证码结果。
admin_login.py:
import time
from importlib.metadata import files
from os import timesimport requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from urllib3 import request#创建驱动对象
driver=webdriver.Chrome()
#访问被测页面
driver.get("网址")
#页面最大化
driver.maximize_window()
#截图验证码图片
driver.find_element(By.XPATH,'验证码xpath').screenshot("截图名称.png")#通过第三方接口发送请求识别验证码内容
url="第三方链接"
#传递参数信息:用户名、密码、用户id、验证码编号
data={"user":"用户名","pass":"密码","sofid":"用户id","codetype":1902
}
#提取验证码图片
files={"userfile":open("截图名称.png","rb")}
#发送接口请求识别验证码
resp=requests.post(url,data=data, files=files)
#查看响应结果:
res=resp.json()
print(res)
if res["err_no"]==0:code=res["pic_str"]
else:print("验证码识别失败")#登录
driver.find_element(By.XPATH,'账号的xpath').send_keys("账号")
driver.find_element(By.XPATH,'密码的xpath').send_keys("密码")
driver.find_element(By.XPATH,'验证码的xpath').send_keys("code")
driver.find_element(By.XPATH,'登录按钮xpath').click()
time.sleep(5)
#关闭驱动
driver.quit()
1.3.封装识别验证码函数
在utils模块中定义一个函数进行识别验证码:
1.发送接口请求,携带对应的参数信息
2.获取返回结果,提取验证码信息
3.返回验证码实际值
utils.py:
import requestsdef img_code():url = "第三方链接"data = {"user": "用户名","pass": "密码","sofid": "用户id","codetype": 1902}files = {"userfile": open("截图名称.png", "rb")}resp = requests.post(url, data=data, files=files)res = resp.json()if res["err_no"] == 0:code = res["pic_str"]print(f"验证码识别成功:{code}")return codeelse:print("验证码识别失败")return False
进行调用函数使用验证码的值:(admin_login.py:)
#调用验证码识别函数获取验证码
code=img_code()
2.通过cookie保持登录
需要保持登录状态的方式:
1.通过cookie信息的唯一标识符id进行验证
2.让标识符id一直保持登录的状态,那么再次访问就是已登录状态
3.通过cookie的机制原理先获取已登录的id,然后在未登录的页面进行使用并且刷新清除缓存
需要退出登录状态方式:
1.关闭整个浏览器:自动清除cookie信息
2.删除已登录的标识符id:刷新页面,自动退出登录状态
注意点:cookie值修改完成之后,一定要进行清除缓存才能生效
2.1给页面添加cookie
使用selenium提供的方法,需要添加的cookie的内容是键值对的方式。
通过手动添加已登录的cookie信息,绕过登录操作流程,直接保持登录状态。
#给页面添加cookie
driver.add_cookie({"name":"cookie名称","value":"值"}
)
#刷新页面清除缓存
driver.refresh()
2.2获取页面的cookie
cookies=driver.get_cookies()
for i in cookies:print(i)
2.3自动化获取cookie
在第一次登录完成之后,把页面的已登录的cookie信息进行保存,后续直接使用已登录的cookie信息。
获取和使用cookie信息:
#保存cookie信息
def save_cookies(driver):cookies=driver.get_cookies()#将cookies的信息转换成json的格式写入到cookies.json文件中with open("cookies.json","w") as f:f.write(json.dumps(cookies))#使用cookie信息
def load_cookies(driver):#从cookies.json文件中读取cookie信息:#将JSON格式的字符串解析为Python对象try:with open("cookies.json") as f:cookies=json.loads(f.read())#获取cookie信息for cookie in cookies:driver.add_cookie(cookie)else:#刷新driver.refresh()except:pass
判断是否登录:
def is_login(driver):if "管理员登录" in driver.title:print("未登录")return Trueelse:print("已登录")
优化代码:
#自己导入
#创建驱动对象
driver=webdriver.Chrome()
#访问被测页面
driver.get("网址")
#页面最大化
driver.maximize_window()#使用cookie信息
load_cookies(driver)if is_login(driver):#截图验证码图片driver.find_element(By.XPATH,'验证码xpath').screenshot("截图名称.png")#调用验证码识别函数获取验证码code=img_code()#登录driver.find_element(By.XPATH,'账号的xpath').send_keys("账号")driver.find_element(By.XPATH,'密码的xpath').send_keys("密码")driver.find_element(By.XPATH,'验证码的xpath').send_keys("code")driver.find_element(By.XPATH,'登录按钮xpath').click()#保存cookie信息save_cookies(driver)time.sleep(5)#关闭驱动driver.quit()
三、excel进行数据加载
1.安装第三方工具
#安装
pip install openpyxl
#查看
pip list
2.封装函数
from openpyxl import load_workbook#读取excel数据
def read_excel(path):#打开文件wb=load_workbook(path)#获取默认的工作表:第二行开始为数据ws=wb.activefor d in ws.iter_rows(min_row=2,values_only=True):yield dif __name__=='__main__':#路径如果抛出unicodeescape错误,使用双反斜杠\\,或者使用正斜杠/,或者加rdata=read_excel('excel表格路径')for d in data:print(d)
3.使用数据
@pytest.mark.parametrize(("wd","count"),read_excel('D:\\installer\\Python\\xm\\pythonProject3\\ddt.xlsx'))
注
内容学自b站 码尚软件测试平台 和 巨量质量管理平台
相关文章:
web自动化笔记(二)
文章目录 一、参数化测试1.pytest命令2.实现参数化测试3.填写地址测试4.生成Allure测试报告5.关键字驱动 二、案例1.实现后台登录1.1登录1.2.处理验证码1.3.封装识别验证码函数 2.通过cookie保持登录2.1给页面添加cookie2.2获取页面的cookie2.3自动化获取cookie 三、excel进行数…...
IIS部署netcore程序后,出现500.30错误解决方案之一
netcore程序部署到IIS后一直出现错误,访问首页后会跳转到登录页地址,然后看到如下错误 HTTP Error 500.30 - ANCM In-Process Start Failure Common solutions to this issue: The application failed to start The application started but then stopp…...
spring 学习(spring-Dl补充(注入不同类型的数据))
前言 在之前的案例,列举的最多的是注入 对象。本篇博客则是补充说我们不仅可以注入对象 还可以注入其他的数据类型包括基本数据类型,引用数据类型。 注入基本数据类型 常见的基本数据类型有:short char int long float double boolean …...
Docker Desktop之Nginx
安装Nginx 把这个复制 到docker 中执行 即可...
利用ffplay播放udp组播视频流
ffplay -fs -fflags nobuffer -flags low_delay -analyzeduration 0 -probesize 32 -framedrop -sync ext -strict experimental udp://224.1.1.1:5001 -fs : 全屏显示 -fflags nobuffer : 禁用输入缓冲(减少100-200ms缓冲延迟) -an…...
【教程】MySQL数据库学习笔记(七)——多表操作(持续更新)
写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 第四章 《数据操…...
2025.2.14——1400
2025.2.14——1400 A 1400 B 1400 C 1400 D 1400 E 1400 F 1400 G 1400 H 1400 ------------------------------------------------ 思维排序/双指针/二分/队列匹配思维二分/位运算思维数学思维 A 一眼想到的是维护信息计数。维护两个信息同时用长的一半去找短的一半…...
DeepSeek教unity------MessagePack-04
Union 联合 MessagePack for C# 支持序列化接口类型和抽象类类型的对象。它的行为类似于 XmlInclude 或 ProtoInclude。在 MessagePack for C# 中,这些被称为Union。只有接口和抽象类可以被 Union 属性注解。需要唯一的联合键。 /******************************…...
Java异常体系深度解析:从Exception到Error
文章目录 前言一、Java异常体系概览ExceptionError 二、受检异常与非受检异常受检异常(Checked Exception)非受检异常(Unchecked Exception) 三、常见的Error类型四、异常处理机制try-catch-finally结构Throws关键字 五、自定义异…...
【linux】文件与目录命令 - ln
文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项 ln 命令用于在文件系统中创建硬链接或符号链接(软链接),是文件共享和路径引用的常用工具。 1. 基本用法 语法: ln [选项] 源文件 [目标文件/目标目录]功能: 创…...
Xilinx kintex-7系列 FPGA支持PCIe 3.0 吗?
Xilinx kintex-7系列资源如下图 Xilinx各系列的GT资源类型和性能 PCIe Gen1/2/3的传输速率对比 K7上面使用的高速收发器GTX最高速率为12.5GT/s, PCIe Gen2 每个通道的传输速率为 5 GT/s。 PCIe Gen3 每个通道的传输速率为 8 GT/s。 所以理论上硬件支持PCIe3.0&#…...
无人机遥感技术在农业中的具体应用:株数和株高、冠层覆盖度、作物倒伏检测、叶面积指数、病虫害监测、产量估算、空间数据综合制图
近年来,随着无人机技术的飞速发展,其在智慧农业领域的应用越来越广泛。无人机遥感作为一种高效的空间大数据获取手段,能够为农业生产提供多时相、多维度、大面积的农情信息,为实现精准农业和智慧农业提供了有力支持。今天…...
前端框架React知识回顾
首先,得确定用户的需求,可能是一个准备面试的前端开发者,想要系统复习React相关知识点。接下来要考虑React的核心概念,比如组件、生命周期、Hooks这些肯定是必须的。然后,面试中常问的问题,比如虚拟DOM、状…...
坑多多之ac8257 i2c1 rtc-pcf8563
pcf85163 ordering information Ordering information Package Description Version Marking code PCF85163T/1 SO8 ① SOT96-1 PF85163 PCF85163TS/1 TSSOP8 ② SOT505-1 85163 ①plastic small outline package; 8 leads;body width 3.9 mm ②plastic thin…...
webpack构建流程
文章目录 [TOC](文章目录) 运行流程初始化流程编译构建流程compile编译make 编译模块build module 完成模块编译 输出流程seal输出资源emit输出完成 小结 运行流程 是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只…...
React - 组件之props属性
在 React 中,props(即属性)是组件之间传递数据的一种方式。它是 React 组件的基础,用于将数据从父组件传递到子组件。 一、类组件中 1. props 的作用 数据传递: props 允许父组件向子组件传递数据。子组件可以使用这些数据来渲…...
PMTUD By UDP
通过UDP探测MTU,并实现udp echo server // Description: UDP echo server. // g udp_echo_server.cc -o udp_echo_server #include <iostream> #include <cstring> #include <arpa/inet.h> #include <unistd.h>#define PORT …...
Hutool - BloomFilter:便捷的布隆过滤器实现
1. 布隆过滤器简介 布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否存在于一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,但缺点是有一定的误判率,即判断元素存在…...
【学习资源】时间序列数据分析方法(1)
时间序列数据分析是一个有趣的话题,让我们多花一些时间来研究。此篇为第一篇文章。主要介绍特征提取方法、深度学习时序数据分析模型、参考资源。期望能帮助大家解决工业领域的相关问题。 1 特征提取方法:信号处理 (来源:INTELLIGENT FAULT DIAGNOSIS A…...
盛铂科技SWFA100捷变频频率综合器:高性能国产射频系统的关键选择
在现代射频系统中,频率综合器是实现精确频率控制和快速跳频的核心组件。盛铂科技推出的SWFA100捷变频频率综合器凭借其卓越的性能和小型化设计,成为高性能射频系统中的理想选择。 SWFA100捷变频频率综合器 高速跳频与宽频覆盖 SWFA100捷变频频率综合器能…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
