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类拦截修改请求-上篇的更多相关文章

  1. Spring实践系列-入门篇(一)

    本文主要介绍了在本地搭建并运行一个Spring应用,演示了Spring依赖注入的特性 1 环境搭建 1.1 Maven依赖 目前只用到依赖注入的功能,故以下三个包已满足使用. <properti ...

  2. Google C++测试框架系列入门篇:第三章 基本概念

    上一篇:Google C++测试框架系列入门篇:第二章 开始一个新项目 原始链接:Basic Concepts 词汇表 版本号:v_0.1 基本概念 使用GTest你肯定会接触到断言这个概念.断言是用 ...

  3. Google C++测试框架系列入门篇:第二章 开始一个新项目

    上一篇:Google C++测试框架系列入门篇:第一章 介绍:为什么使用GTest? 原始链接:Setting up a New Test Project 词汇表 版本号:v_0.1 开始一个新项目 ...

  4. 深入浅出ASP.NET Core系列(入门篇)

    入门篇 1.1.专题介绍 1.2.环境安装 1.3.创建项目 1.4部署到IIS 1.5准备CentOS和Nginx环境 1.6部署到CentOS 2.1命令行和JSON的配置 2.2Bind建立配置 ...

  5. Python入门之Python的单例模式和元类

    一.单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上 ...

  6. 0x00-Kali Linux 系列入门篇

    Kali Linux介绍篇 Kali Linux 官网:https://www.kali.org/ Kali Linux 前身是著名渗透测试系统BackTrack ,是一个基于 Debian 的 Li ...

  7. Node.js 从入门到茫然系列——入门篇

    在创建服务的时候,我们一般代码就是: var http = require("http"); var server = http.createServer(function(req ...

  8. Google C++测试框架系列入门篇:第一章 介绍:为什么使用GTest?

    原始链接:Introduction: Why Google C++ Testing Framework? 词汇表 版本号:v_0.1 介绍:为什么使用GTest? GTest帮助你写更好的C++测试代 ...

  9. java并发编程系列原理篇--JDK中的通信工具类Semaphore

    前言 java多线程之间进行通信时,JDK主要提供了以下几种通信工具类.主要有Semaphore.CountDownLatch.CyclicBarrier.exchanger.Phaser这几个通讯类 ...

  10. Java入门篇(五)——字符串/String类

    前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基 ...

随机推荐

  1. 搞定了 6 种分布式ID,分库分表哪个适合做主键?

    大家好,我是小富- 本文是<ShardingSphere5.x分库分表原理与实战>系列的第七篇,目前系列的前几篇制作成了PDF,需要的可以在文末获取下载方式,持续更新中.今天咱们继续一起来 ...

  2. byte[]类型与datetime日期转换

    在C#中,Timestamp通常表示为一个长整型(long)变量.这是因为它表示自1970年1月1日00:00:00 UTC以来的毫秒数.然而,在某些情况下,例如在处理数据库中的Timestamp时, ...

  3. ajax,axios和fetch三者间的区别.

    ajax: 1. 传统 Ajax 指的是 XMLHttpRequest(XHR), 最早出现的发送后端请求技术,隶属于原生js中,核心使用XMLHttpRequest对象,多个请求之间如果有先后关系的 ...

  4. 跨模态学习能力再升级,EasyNLP电商文图检索效果刷新SOTA

    简介: 本⽂简要介绍我们在电商下对CLIP模型的优化,以及上述模型在公开数据集上的评测结果.最后,我们介绍如何在EasyNLP框架中调用上述电商CLIP模型. 作者:熊兮.欢夏.章捷.临在 导读 多模 ...

  5. 阿里云 MSE 支持 Go 语言流量防护

    简介: OpenSergo 开源项目联合 Sentinel 项目,正在制定.完善限流降级标准,方便不同语言应用通过统一控制面来实现统一的微服务治理.阿里云微服务引擎(MSE)也会逐步支持 OpenSe ...

  6. 从图森未来的数据处理平台,看Serverless工作流应用场景

    4月,阿里云Serverless工作流正式商业化,这是一款用于协调多个分布式任务执行的全托管 Serverless 云服务.产品致力于简化开发和运行业务流程所需要的任务协调.状态管理以及错误处理等繁琐 ...

  7. 系列解读SMC-R:透明无感提升云上 TCP 应用网络性能(一)| 龙蜥技术

    ​简介:已有的应用若想使用RDMA技术改造成本高,那么有没有一种技术是不做任何改造就可以享受RDMA带来的性能优势? ​ 文/龙蜥社区高性能网络SIG 引言 Shared Memory Communi ...

  8. 阿里云全站加速DCDN重磅升级

    ​简介:相比传统CDN加速,全站加速DCDN具有更广阔的应用场景.在当下企业全面数字化的进程中,为了更全面地满足广大企业客户的个性化加速需求,全站加速DCDN从简单开通到个性化定制.从内容分发到安全防 ...

  9. 龙蜥社区成立系统运维SIG,重磅开源sysAK系统运维工具集

    简介:系统运维SIG致力于打造一个集主机管理.配置部署.监控报警.异常诊断.安全审计等一系列功能的自动化运维平台. ​ OpenAnolis 龙蜥社区(以下简称"龙蜥社区")正式成 ...

  10. Apsara Stack 2.0技术百科(9宫格)

    ​ ​ ​​​​​​​​ 原文链接 本文为阿里云原创内容,未经允许不得转载. ​