超强整理,Web自动化测试-验证码/cookie机制(详全)

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

1、后台登录案例

设计测试用例处理验证码以及绕过登录使用cookie机制

1)搭建测试环境

安装第三方库,配置对应的测试环境
需要安装依赖库

pip install selenium

安装对应的浏览器以及驱动
谷歌浏览器
谷歌的驱动

浏览器和驱动版本号一定要保持一致才能进行使用

版本号是114之前:
https://chromedriver.storage.googleapis.com/index.html
版本号是114之后:
https://googlechromelabs.github.io/chrome-for-testing/#stable

将谷歌驱动下载完成之后,放置项目文件中即可使用

2)验证测试环境

import time
from selenium import webdriver# 创建驱动对象
driver = webdriver.Chrome()# 访问被测地址
url = "http:n&"
driver.get(url)# 页面最大化
driver.maximize_window()# 强制等待
time.sleep(5)# 关闭驱动
driver.quit()

3)设计流程用例

定位页面元素
操作页面元素

后台登录业务流程用例设计:
访问后台登录页面
输入账号
输入密码
输入验证码
点击登录按钮

import time
from selenium import webdriver
from selenium.webdriver.common.by import By# 创建驱动对象
driver = webdriver.Chrome()# 访问被测地址
url = "http:/bin&"
# # - 访问后台登录页面
driver.get(url)# 页面最大化
driver.maximize_window()# - 输入账号
driver.find_element(By.XPATH,
'/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[2]/td[2]/input').send_keys("admin")# - 输入密码
driver.find_element(By.XPATH,
'/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[3]/td[2]/input').send_keys("msjy123")# - 输入验证码
driver.find_element(By.XPATH,
'/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[5]/td[2]/input').send_keys("8888")# - 点击登录按钮
driver.find_element(By.XPATH, '//*[@id="login_btn"]').click()# 强制等待
time.sleep(5)
# 关闭驱动
driver.quit()

4)验证码处理

一般情况公司如果涉及web自动化测试需要对验证码进行处理会有以下几种方式:
关闭验证码的功能
设置万能的验证码

通过第三方打码平台识别验证码
获取验证码图片

使用selenium提供的截图方法获取验证码图片

# 截取验证码图片
driver.find_element(By.XPATH, '//*[@id="verify"]').screenshot('verify.png')

通过第三方接口发送请求识别验证码图片内容
超级鹰官方平台:https://www.chaojiying.com/price.html

识别验证码图片的接口:https://upload.chaojiying.net/Upload/Processing.php

# 通过第三方接口发送请求识别验证码图片内容
url2 = "https://upload.chaojiying.net/Upload/Processing.php"# 传参数据
data = {# 用户名"user": "tianqiu2",# 密码"pass": "ltqiu123456",# 用户id"sofid": "949627",# 验证码的编号:整数类型"codetype": 1902
}# 提取验证码图片
files = {"userfile": open("verify.png", "rb")}# 发送请求识别验证码
resp = requests.post(url2, data=data, files=files)# 查看响应结果
print(type(resp.json())) # <class 'dict'>返回结果是字典类型
print(resp.json())

从返回结果的字典中提取验证码结果

# 提取验证码数字
if res["err_no"] == 0:code = res["pic_str"]print(f"验证码识别成功:{code}")
else:print("验证码识别失败")

注意点:
一般处理特殊场景或者特殊功能实现不会与用例脚本代码混合在一个模块中,而是会进行独立封装然后调用;
主要的核心目的是实现降低代码的耦合性;

5)封装识别函数

在utils模块中定义img_code函数进行封装

import requestsdef img_code():# 通过第三方接口发送请求识别验证码图片内容url2 = "https://upload.chaojiying.net/Upload/Processing.php"# 传参数据data = {# 用户名"user": "tianqiu2",# 密码"pass": "ltqiu123456",# 用户id"sofid": "949627",# 验证码的编号:整数类型"codetype": 1902}# 提取验证码图片files = {"userfile": open("verify.png", "rb")}# 发送请求识别验证码resp = requests.post(url2, data=data, files=files)# 查看响应结果# print(type(resp.json())) # <class 'dict'>返回结果是字典类型# print(resp.json())res = resp.json()# 提取验证码数字if res["err_no"] == 0:code = res["pic_str"]print(f"验证码识别成功:{code}")return codeelse:print("验证码识别失败")return False

在用例脚本中可以调用函数识别验证码输入:

# 调用识别验证码函数获取验证码内容
code = img_code()# - 输入验证码
driver.find_element(By.XPATH,
'/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[5]/td[2]/input').send_keys(code)

2、通过cookie保持登录

需要保持自动登录的方式:
通过cookie信息的唯一标识符id进行验证;
让标识符id一直保持登录状态,那么再次访问就是已登录状态;
通过cookie的机制原理先获取已登录的id然后在未登录的页面进行使用并且刷新;

需要退出状态状态的方式:
关闭浏览器;
自动清楚cookie信息;
删除已登录的标识符id;
默认退出登录状态;

注意点:对页面的cookie值进行修改完成之后,一定要进行刷新页面清除缓存才能生效

1)给页面添加cookie

使用selenium提供的方法:add_cookies,需要天剑的cookie内容都是键值对的方式

通过手动添加已登录的cookie信息,绕过登录,保持登录状态

# 手动添加cookie信息进入自动登录
driver.add_cookie(
{"name": "PHPSESSID", "value": "t83q6ua3v073nuc9dur8m08qi6"}
)# 刷新页面清除缓存
driver.refresh()

2)获取页面的cookie

通过selenium提供的get_cookies()获取当前页面的cookie信息

# 获取页面的cookie信息
cookies = driver.get_cookies()
for i in cookies:print(i)

3)自动化获取cookie

在第一次登录完成之后,把当前页面的已登录的cookie信息进行保存
在第二次及以后所有的登录中使用已登录的cookie信息,直接绕过登录

定义2个函数来获取cookie信息和使用cookie信息

# 保存cookie信息
def save_cookie(driver):# 将页面中的cookie信息保存在json文件中# 获取页面的cookie信息cookies = driver.get_cookies()with open("cookies.json", "w") as f:# 将cookie字典类型转化成json类型写入到cookies.json文件中f.write(json.dumps(cookies))# 使用cookie信息
def load_cookies(driver):# 从cookies,json文件中读取cookie信息with open("cookies.json", ) as f:# 将json文件格式转化为Python中的字典cookies = json.loads(f.read())# 遍历字典获取键值对cookie进行添加for cookie in cookies:driver.add_cookie(cookie)else:# 刷新页面,清除缓存driver.refresh()

出现问题:
进入被测页面之后直接使用cookie信息,那么没有对应的cookies.json文件那么程序会报错

解决方案:
在读取cookie信息的文件函数中添加捕获异常的代码

# 使用cookie信息
def load_cookies(driver):# 从cookies,json文件中读取cookie信息try:with open("cookies.json", ) as f:# 将json文件格式转化为Python中的字典cookies = json.loads(f.read())# 遍历字典获取键值对cookie进行添加for cookie in cookies:driver.add_cookie(cookie)else:# 刷新页面,清除缓存driver.refresh()except:pass

当使用cookie信息进行绕过登录之后,原来的页面元素无法进行定位
判断当前页面是否登录

已登录
不执行流程用例脚本

未登录
执行流程用例脚本完成第一次登录保存cookies.json

通过定义一个函数判断页面的标题是否是登录状态

# 通过定义一个函数判断页面的标题是否是登录状态
def is_login(driver):if "管理员登录" in driver.title:print("目前没有cookies信息,需要进行正常流程登录")return Trueelse:print("已登录")return False

用例完整流程执行脚本:

import code
import timeimport requests as requests
from selenium import webdriver
from selenium.webdriver.common.by import Byfrom utils import img_code, load_cookies, save_cookie,is_login# 创建驱动对象
driver = webdriver.Chrome()
# 访问被测地址url = "http:/n&"
# # - 访问后台登录页面
driver.get(url)# 页面最大化
driver.maximize_window()# 使用cookie信息
load_cookies(driver)if is_login(driver):# 截取验证码图片driver.find_element(By.XPATH, '//*[@id="verify"]').screenshot('verify.png')# 调用识别验证码函数获取验证码内容code = img_code()# - 输入账号driver.find_element(By.XPATH,
'/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[2]/td[2]/input').send_keys("admin")# - 输入密码driver.find_element(By.XPATH,
'/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[3]/td[2]/input').send_keys("msjy123")# - 输入验证码driver.find_element(By.XPATH,
'/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[5]/td[2]/input').send_keys(code)# - 点击登录按钮driver.find_element(By.XPATH, '//*[@id="login_btn"]').click()# 保存cookie信息save_cookie(driver)# 强制等待time.sleep(5)# 关闭驱动driver.quit()
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

人生路上或许充满了迷茫、坎坷和挑战,但只要保持勇气、耐心和信念,就能越过重重困难,走向辉煌的彼岸。相信自己,勇往直前!

在追逐梦想的路上,不要畏惧失败与挫折,因为最伟大的胜利往往诞生于最艰难的时刻。坚持奋斗,相信自己,你定能创造属于自己的辉煌。

生活就像一场马拉松,不是速度快与否,而是坚持到底的勇气和毅力。不论前方有多少困难,只要心怀梦想,勇往直前,你定能迎接辉煌的成功。

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

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

相关文章

C#使用SyntaxTree获取.cs文件中的属性名和注释

有时候&#xff0c;我们可能需要获取.cs文件中的属性和对应的注释来生成一些代码&#xff0c;比如SQL查询什么的。 但使用正则匹配有时候会不准确。搜索了下&#xff0c;发现微软提供了代码解析的API。 具体如下两个方法&#xff1a; /// <summary> /// 获取所有属性和…

Springboot整合Elastic-job

一 概述 Elastic-Job 最开始只有一个 elastic-job-core 的项目&#xff0c;定位轻量级、无中心化&#xff0c;最核心的服务就是支持弹性扩容和数据分片&#xff01;从 2.X 版本以后&#xff0c;主要分为 Elastic-Job-Lite 和 Elastic-Job-Cloud 两个子项目。esjbo官网地址 Ela…

【五】【C语言\动态规划】删除并获得点数、粉刷房子、买卖股票的最佳时机含冷冻期,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

Docker部署Plik临时文件上传系统并实现远程访问设备上传下载文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

K8S中的job和CronJob

Job 介绍 Kubernetes jobs主要是针对短时和批量的工作负载。它是为了结束而运行的&#xff0c;而不是像deployment、replicasets、replication controllers和DaemonSets等其他对象那样持续运行。 示例 apiVersion: batch/v1 kind: Job metadata:name: pispec:template:spec:r…

Golang - 执行 shell 脚本,并实时按行打印 shell 脚本输出信息

原文链接&#xff1a;https://blog.csdn.net/flyfreelyit/article/details/103697013 测试代码地址&#xff1a;https://github.com/kirinlabs/execshell Golang 执行 shell 脚本&#xff0c;不接收返回值 // 返回一个 cmd 对象 cmd : exec.Command("sh", "-c…

【持续学习系列(四)】《Lifelong-RL》

一、论文信息 1 标题 Lifelong-RL: Lifelong Relaxation Labeling for Separating Entities and Aspects in Opinion Targets 2 作者 Lei Shu, Bing Liu, Hu Xu, and Annice Kim 3 研究机构 Department of Computer Science, University of Illinois at Chicago, USACent…

MySQL 和 MySQL2 的区别

MySQL是最流行的开源关系型数据库管理系统,拥有大量的使用者和广泛的应用场景。而MySQL2是MySQL官方团队推出的新一代MySQL驱动&#xff0c;用于取代老版的MySQL模块&#xff0c;提供更好的性能和更丰富的功能。 本文将介绍MySQL2相较于MySQL有哪些优势以及具体的技术区别。 …

[Angular] 笔记 11:可观察对象(Observable)

chatgpt: 在 Angular 中&#xff0c;Observables 是用于处理异步数据流的重要工具。它们被广泛用于处理从异步操作中获取的数据&#xff0c;比如通过 HTTP 请求获取数据、定时器、用户输入等。Observables 提供了一种机制来订阅这些数据流&#xff0c;并可以在数据到达时执行相…

代码随想录算法训练营day1|704.二分查找、27.移除元素

第一章 数组 part01 今日任务 数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 详细布置 数组理论基础 文章链接&#xff1a;代码随想录 题目建议&#xff1a; 了解一下数组基础&#xff0c;以及数组的内存空间地址&#xff0c;数组也没那么简单。 704. 二…

炮炮面试——经典面试问题汇总

面试前准备 公司官网(仔细了解&#xff09;&#xff1a;成立时间&#xff0c;主营业务&#xff0c;组织架构招聘简章(重点了解)&#xff1a;任何问题都要围绕招聘简章回答&#xff0c;最好背下来岗位意义 (了解痛点) 1、自我介绍 面试官&#xff0c;您好&#xff01; …

第08章:随堂复习与企业真题(面向对象-高级)

来源&#xff1a;尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备) 基本都是宋老师发的资料里面的内容&#xff0c;只不过补充几个资料里没直接给出答案的问题的答案。 不想安装markdown笔记的app所以干脆在这里发一遍。 第08章&#xff1a;随堂复习…

Jupyter Notebook 开启远程登录

Jupyter Notebook可以说是非常好用的小工具&#xff0c;但是不经过配置只能够在本机访问 安装jupyter notebook conda install jupyter notebook 生成默认配置文件 jupyter notebook --generate-config 将会在用户主目录下生成.jupyter文件夹&#xff0c;其中jupyter_noteb…

查看ios app运行日志

摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具&#xff0c;该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和奔溃日志。同时还提供了奔溃日志分析查看模块&#xff0c;可以对苹果奔溃日志进行符号化、格式化和分析&#xff0c;极大地简化了开发者的调试…

Pandas 高级教程——IO 操作

Python Pandas 高级教程&#xff1a;IO 操作 Pandas 提供了强大的 IO 操作功能&#xff0c;可以方便地读取和写入各种数据源&#xff0c;包括文本文件、数据库、Excel 表格等。本篇博客将深入介绍 Pandas 中的高级 IO 操作&#xff0c;通过实例演示如何灵活应用这些功能。 1.…

短说社区运营的使用工具分享(一)

本文是一篇针对短说社区运营的使用工具分享帖&#xff0c;是小编结合日常使用&#xff0c;总结的一些可以帮助网站管理员和运营人员进行日常操作和管理的工具。 1. 想天工作台之运营面板 想天工作台可以将桌面划分不同的类型来辅助办公&#xff0c;我分享下我当前的桌面情况&…

基于Mbed Studio环境下开发STM32

基于Mbed Studio环境下开发STM32 &#x1f4cd;Mbed官网&#xff1a;https://os.mbed.com/ ✨mbed OS是ARM出的一个免费开源的&#xff0c;面向物联网的操作系统。提供了一个定义良好的API来开发C应用程序&#xff1b;集成度很高&#xff0c;类似Arduino&#xff0c;目前并不兼…

新兴品牌如何做好传播?媒介盒子分享三招

很多品牌抓住了品类和流量红利&#xff0c;给自己做了传播&#xff0c;但是红利是有时效的&#xff0c;流量越来越贵&#xff0c;竞争对手你追我赶&#xff0c;只有真正占领用户心智&#xff0c;才能获取长期利润。今天媒介盒子就来和大家聊聊&#xff1a;新兴品牌如何做好传播…

elementui 表单校验validate不起效果

原因&#xff1a; 自定义的validator验证方式需要调用callback。 验证失败callabck(new Errno(‘’)). 验证成功 callback() var checkNumber3 (rule, value, callback) > {if (value && !Number.isInteger(value)) {callback(new Error("请输入数字值"…

Java 中 Lambda 表达式的使用

目录 一、Lambda 表达式的概念 二、Lambda 表达式的语法格式 三、Lambda 表达式的案例使用 1、使用 Lambda 来实现启动线程 2、使用 Lambda 表达式实现集合的排序 3、使用 Lambda 表达式实现文件夹下的文件查找 一、Lambda 表达式的概念 Lambda 表达式是特殊的匿名内部类…