《最新出炉》系列入门篇-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的基本数据类型之一,但可以像基 ...
随机推荐
- triple loss
Triplet Loss是深度学习中的一种损失函数,用于训练差异性较小的样本,如人脸等, Feed数据包括锚(Anchor)示例.正(Positive)示例.负(Negative)示例,通过优化锚示例 ...
- 【Python3.10.4】Centos7 ,centos8,centos9源码安装 python3.10.4 解释器
1.检查是否安装wget如果没有安装则: 终端执行: yum -y install wget 2.下载python3源码包 终端执行: wget https://www.python.org/ftp/ ...
- Unable to determine application id: com.android.tools.idea.run.ApkProvisionException: No outputs for the main artifact of variant: debug
前言 遇到这种情况极大可能属于gradle 与 android studio版本不匹配的情况. 因为我是在升级android studio遇到的这个问题. 方法 一个方法是:降低android stu ...
- 远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件
报错信息 VSCode无法连接远程服务器,终端一直提醒: [22:46:01.906] > Waiting for server log... [22:46:01.936] > Waiti ...
- springboot多模块项目启动经历
springboot多模块使用 @ 目录 springboot多模块使用 前言 大佬把项目权限给我了,我就先下下来看看学习一下 一.识别 二.maven配置 1.安装maven 三.加载刷新 总结 前 ...
- eclipse jar包 Source not found
jar包 Source not found 错误内容: Source not found The source attachment does not contain the source for t ...
- IOT设备连接上云
如何让我的设备连接上云?参考如下路径. 云 [![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/974556/1 ...
- Datastream 开发打包问题
简介:Datastream作业开发时往往会遇到一些jar包冲突等问题,本文主要讲解作业开发时需要引入哪些依赖以及哪些需要被打包进作业的jar中,从而避免不必要的依赖被打入了作业jar中以及可能产生的 ...
- 5分钟搞定AlertManager接入短信、语音等10+种通知渠道
简介: Alert Manager是开源监控系统Prometheus中用于处理告警信息的服务,通过将日志服务开放告警配置为Alert Manager中的一个Receiver,可以将Alert Man ...
- go语言package使用
近期接触go感觉package包之间引用很麻烦,很绕圈子.下面一起理一理这个package咋用 关于package: 1.不限于一个文件,可以多个文件组成一个package 2.不要求package的 ...