《最新出炉》系列入门篇-Python+Playwright自动化测试-48-Route类拦截修改请求-上篇
1.简介
在日常工作和学习中,自动化测试的时候:在加载页面时,可能页面出现很多不是很重要或者不是我们所关注的,这个时候我们就可以选择不加载这些内容,以提高页面加载速度,节省资源。例如:可能页面上图片比较多,而我们又不关心图片内容。那么,在加载页面时,可以选择不加载图片,以提高页面加载速度。这里我们主要用到一个Route类拦截修改请求 。
2.Route类语法
Route类介绍官方API的文档地址:https://www.cuketest.com/playwright/docs/api/class-route/
在Playwright中,`Route`类用于捕获和修改请求和响应。它允许您拦截和处理特定的网络请求,以模拟不同的行为或进行自定义操作。
您可以使用`page.route()`方法创建`Route`对象,并指定要拦截的请求URL或使用正则表达式进行匹配。
一旦创建了`Route`对象,您可以通过调用`route.continue()`、`route.fulfill()`或`route.abort()`来控制请求的进一步处理。
还可以通过`route.request()`和`route.response()`属性来访问请求和响应对象。
使用`Route`类,您可以拦截和修改网络请求,从而实现各种目的,如网络请求的模拟、修改请求头、延迟响应等。它是一个非常有用的工具,可用于各种Web自动化和测试场景中。
3.Route类方法
abort()取消匹配的路由请求fulfill(response)伪造服务器返回数据,如body、headers等continue(request)伪造路由请求数据fallback(request)伪造路由请求数据,允许多次使用
3.1abort
`route.abort(errorCode?: ErrorCode): Promise<void>` - 中止请求,并可以选择指定错误代码。
当使用Playwright与Python一起使用时,您可以使用`Route`类的`abort()`方法来中止请求。
宏哥这里以度娘为例,刚好在两会期间,度娘首页的图片换成两会的gif的动态图。然后宏哥将其拦截中止请求不显示。首先看一下没有拦截之前度娘首页,如下图所示:

3.1.1代码设计

3.1.2参考代码
# coding=utf-8 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 # 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-03-09
@author: 北京-宏哥
公众号:北京宏哥
Project: 《最新出炉》系列入门篇-Python+Playwright自动化测试-49-Route类拦截修改请求-上篇
'''
# 3.导入模块
from playwright.sync_api import sync_playwright def intercept_request(route, request):
if request.url.startswith("https://www.baidu.com/"):
print(f"Intercepted request to: {request.url}")
route.abort() # 中止请求 with sync_playwright() as playwright:
browser = playwright.chromium.launch(headless=False)
page = browser.new_page() # 监听请求并拦截
page.route("https://www.baidu.com/img/*", lambda route, request: intercept_request(route, request))
page.wait_for_timeout(3000)
page.goto("https://www.baidu.com/")
#page.pause()
page.wait_for_timeout(3000)
# page.pause()
print('Test Complete') # Add break point here
browser.close()
3.1.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

3.复制拦截的URL地址进行访问,我们可以看到切好是两会的gif图片,如下图所示:

在上面的例子中,我们创建了一个简单的Playwright脚本,当页面加载后,它会监听和拦截所有的请求。在`intercept_request`函数中,我们判断如果请求的URL以"https://www.baidu.com/"开头,就打印一条信息,并调用`route.abort()`来中止请求。
当运行这个脚本时,如果页面中有请求的URL以"https://www.baidu.com/"开头,那么该请求将被中止。
3.2fulfill
`route.fulfill(response: FulfillOptions): Promise<void>` - 使用自定义的响应对象来履行请求。响应对象包含状态码、头信息和响应体等。
Route类的fulfill()方法用于模拟完成请求,即手动提供响应数据并结束请求 。
宏哥这里以一个API为例,修改其响应数据。首先来看一下没有修改正常响应数据(一大串的json数据),如下图所示:

3.2.1代码设计

3.2.2参考代码
# coding=utf-8 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 # 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-03-09
@author: 北京-宏哥
公众号:北京宏哥
Project: 《最新出炉》系列入门篇-Python+Playwright自动化测试-49-Route类拦截修改请求-上篇
'''
# 3.导入模块
from playwright.sync_api import sync_playwright def intercept_request(route, request):
if request.url.startswith("https://dog.ceo/api/breeds/list/all"):
print(f"Intercepted request to: {request.url}")
route.fulfill(status=200, body='{"message": "Hello, World!"}', headers={'Content-Type': 'application/json'})
else:
route.continue_() with sync_playwright() as playwright:
browser = playwright.chromium.launch(headless=False)
page = browser.new_page() # 监听请求并拦截
page.route("**/*", lambda route, request: intercept_request(route, request)) page.goto("https://dog.ceo/api/breeds/list/all")
page.wait_for_timeout(3000)
page.pause()
print('Test Complete') # Add break point here
browser.close()
3.2.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

3.修改响应结果后,返回的结果,如下图所示:

3.3fetch
执行请求并在不满足的情况下获取结果,以便可以修改响应,然后完成响应。
宏哥这里还是以上边的API为例,修改其响应数据。首先来看一下没有修改正常响应数据(一大串的json数据),如下图所示:

3.3.1代码设计

3.3.2参考代码
# coding=utf-8 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 # 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-03-09
@author: 北京-宏哥
公众号:北京宏哥
Project: 《最新出炉》系列入门篇-Python+Playwright自动化测试-49-Route类拦截修改请求-上篇
'''
# 3.导入模块
from playwright.sync_api import sync_playwright def handle(route):
response = route.fetch()
json = response.json()
json["message"]["beijing-hongge"] = ["beijing-hongge"]
route.fulfill(response=response, json=json) with sync_playwright() as playwright:
browser = playwright.chromium.launch(headless=False)
page = browser.new_page() page.route("https://dog.ceo/api/breeds/list/all", handle)
page.goto("https://dog.ceo/api/breeds/list/all")
page.wait_for_timeout(3000)
page.pause()
print('Test Complete') # Add break point here
browser.close()
3.3.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

3.修改响应结果后,返回的结果,如下图所示:

这个例子实现给响应json数据增加
json["message"]["beijing-hongge"] = ["beijing-hongge"]
4.小结
今天主要分享和介绍了使用playwright如何中止请求、修改响应结果的几个方法,这个对于接口自动化测试应用会比较多,感觉类似抓包工具一样。中止请求还可以中止一些不必要的请求,从而提高性能和测试效率,节约资源。好了,今天时间也不早了,宏哥就讲解和分享到这里,感谢您耐心的阅读,希望对您有所帮助。
《最新出炉》系列入门篇-Python+Playwright自动化测试-48-Route类拦截修改请求-上篇的更多相关文章
- Spring实践系列-入门篇(一)
本文主要介绍了在本地搭建并运行一个Spring应用,演示了Spring依赖注入的特性 1 环境搭建 1.1 Maven依赖 目前只用到依赖注入的功能,故以下三个包已满足使用. <properti ...
- Google C++测试框架系列入门篇:第三章 基本概念
上一篇:Google C++测试框架系列入门篇:第二章 开始一个新项目 原始链接:Basic Concepts 词汇表 版本号:v_0.1 基本概念 使用GTest你肯定会接触到断言这个概念.断言是用 ...
- Google C++测试框架系列入门篇:第二章 开始一个新项目
上一篇:Google C++测试框架系列入门篇:第一章 介绍:为什么使用GTest? 原始链接:Setting up a New Test Project 词汇表 版本号:v_0.1 开始一个新项目 ...
- 深入浅出ASP.NET Core系列(入门篇)
入门篇 1.1.专题介绍 1.2.环境安装 1.3.创建项目 1.4部署到IIS 1.5准备CentOS和Nginx环境 1.6部署到CentOS 2.1命令行和JSON的配置 2.2Bind建立配置 ...
- Python入门之Python的单例模式和元类
一.单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上 ...
- 0x00-Kali Linux 系列入门篇
Kali Linux介绍篇 Kali Linux 官网:https://www.kali.org/ Kali Linux 前身是著名渗透测试系统BackTrack ,是一个基于 Debian 的 Li ...
- Node.js 从入门到茫然系列——入门篇
在创建服务的时候,我们一般代码就是: var http = require("http"); var server = http.createServer(function(req ...
- Google C++测试框架系列入门篇:第一章 介绍:为什么使用GTest?
原始链接:Introduction: Why Google C++ Testing Framework? 词汇表 版本号:v_0.1 介绍:为什么使用GTest? GTest帮助你写更好的C++测试代 ...
- java并发编程系列原理篇--JDK中的通信工具类Semaphore
前言 java多线程之间进行通信时,JDK主要提供了以下几种通信工具类.主要有Semaphore.CountDownLatch.CyclicBarrier.exchanger.Phaser这几个通讯类 ...
- Java入门篇(五)——字符串/String类
前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基 ...
随机推荐
- xilinx的serdes接收时钟坑
ilinx的7 series fpga transceivers wizard用于自定义的serdes编码. 要选择多个serdes端口,如下图,点击对应的名称,然后右边选择use该设备就可以. 生成 ...
- 简单的UrlDns链分析
URLDNS链学习 首先我们先理解一下序列化与反序列化,我先贴出三段代码,大家可以尝试先体验一下. 首先我们先构造一个Person类,其实跟这条链没什么关系,主要涉及序列化 点击查看代码 // 引入 ...
- vue项目如何部署?有遇到布署服务器后刷新404问题吗?
一.如何部署 前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道vue项目在构建后,是生成一系列的静态文件 常规布署我们只需要 ...
- Node.js 中的事件循环机制
一.是什么 在浏览器事件循环中,我们了解到javascript在浏览器中的事件循环机制,其是根据HTML5定义的规范来实现 而在NodeJS中,事件循环是基于libuv实现,libuv是一个多平台的专 ...
- asyncio和aiohttp携程并发
import asyncio from aiohttp import web import time async def process(): for i in range(10): print(&q ...
- ArcPy自动绘制大量地图并设置地图要素:Python
本文介绍基于Python语言中ArcPy模块,实现ArcMap自动批量出图,并对地图要素进行自定义批量设置的方法. 1 任务需求 首先,我们来明确一下本文所需实现的需求. 现有通过Pyth ...
- 力扣1083(MySQL)-销售分析Ⅲ(简单)
题目: Table: Product Table: Sales 编写一个SQL查询,报告2019年春季才售出的产品.即仅在2019-01-01至2019-03-31(含)之间出售的商品. 以 任意顺序 ...
- HarmonyOS NEXT应用开发之MpChart图表实现案例
介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI.本示例主要介绍如何使用三方库MpChart实现柱状图U ...
- Java工具篇之Disruptor高性能队列
简介: disruptor适用于多个线程之间的消息队列,`作用与ArrayBlockingQueue有相似之处`,但是disruptor从功能.性能都远好于ArrayBlockingQueue,当多个 ...
- Ingress Nginx 接连披露高危安全漏洞,是否有更好的选择?
简介: 在<K8s 网关选型初判:Nginx 还是 Envoy>一文中,我们已经给出了这个新的选项:MSE 云原生网关.本文继续展开分析,为何 MSE 云原生网关有更好的安全性保障. 作者 ...