最强自动化测试框架Playwright(33)-Route类拦截修改请求

news2024/12/25 9:31:50

在Playwright中,`Route`类用于捕获和修改请求和响应。它允许您拦截和处理特定的网络请求,以模拟不同的行为或进行自定义操作。

您可以使用`page.route()`方法创建`Route`对象,并指定要拦截的请求URL或使用正则表达式进行匹配。

一旦创建了`Route`对象,您可以通过调用`route.continue()`、`route.fulfill()`或`route.abort()`来控制请求的进一步处理。

还可以通过`route.request()`和`route.response()`属性来访问请求和响应对象。

使用`Route`类,您可以拦截和修改网络请求,从而实现各种目的,如网络请求的模拟、修改请求头、延迟响应等。它是一个非常有用的工具,可用于各种Web自动化和测试场景中。

方法

abort

`route.abort(errorCode?: ErrorCode): Promise<void>` - 中止请求,并可以选择指定错误代码。

当使用Playwright与Python一起使用时,您可以使用`Route`类的`abort()`方法来中止请求。以下是一个使用Playwright和Python的例子,展示如何使用`abort()`方法中止请求:

from playwright.sync_api import sync_playwright

def intercept_request(route, request):
    if request.url.startswith("https://example.com/api"):
        print(f"Intercepted request to: {request.url}")
        route.abort()  # 中止请求

with sync_playwright() as playwright:
    browser = playwright.chromium.launch()
    page = browser.new_page()

    # 监听请求并拦截
    page.route("**/*", lambda route, request: intercept_request(route, request))

    page.goto("https://example.com")

    browser.close()

在上面的例子中,我们创建了一个简单的Playwright脚本,当页面加载后,它会监听和拦截所有的请求。在`intercept_request`函数中,我们判断如果请求的URL以"https://example.com/api"开头,就打印一条信息,并调用`route.abort()`来中止请求。

当运行这个脚本时,如果页面中有请求的URL以"https://example.com/api"开头,那么该请求将被中止。

请注意,示例中使用的是`sync_playwright`模块,这是同步API的示例。您也可以使用异步的API来编写类似的代码,例如使用`async_playwright`模块和异步函数。

 

continue

`route.continue(): Promise<void>` - 继续请求,使其按正常流程继续发送并接收响应。 

以下是一个使用Playwright和Python的例子,展示如何使用`Route`类的`continue()`方法继续请求:

```python
from playwright.sync_api import sync_playwright

def intercept_request(route, request):
    if request.url.startswith("https://example.com/api"):
        print(f"Intercepted request to: {request.url}")
        route.continue()  # 继续请求

with sync_playwright() as playwright:
    browser = playwright.chromium.launch()
    page = browser.new_page()

    # 监听请求并拦截
    page.route("**/*", lambda route, request: intercept_request(route, request))

    page.goto("https://example.com")

    browser.close()
```

在上面的例子中,我们创建了一个简单的Playwright脚本,在页面加载后监听和拦截所有的请求。在`intercept_request`函数中,我们判断如果请求的URL以"https://example.com/api"开头,就打印一条信息,并调用`route.continue()`来继续请求。

当运行这个脚本时,所有的请求都会被拦截,但是只有那些URL以"https://example.com/api"开头的请求会被继续。

同样地,请注意示例中使用的是`sync_playwright`模块,这是同步API的示例。您也可以使用异步的API来编写类似的代码,例如使用`async_playwright`模块和异步函数。

 

fallback

Route类的fallback()方法可以用于指定当请求未匹配到任何拦截规则时的回退行为

from playwright.sync_api import sync_playwright, Route


def intercept_request(route:Route, request):
    if request.url.startswith("http://www.baidu.com/api"):
        print(f"拦截请求: {request.url}")
        route.continue_()  # 中止请求
    else:
        print(f"Fallback: {request.url}")
        route.fallback()

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("http://www.baidu.com")

    browser.close()

 

当页面加载后会监听和拦截所有请求。在intercept_request函数中,我们根据请求的URL进行条件判断。如果URL以"https://www.baidu.com/api"开头,我们打印一条拦截消息并调用route.continue()来继续请求。否则,我们打印一条回退消息并调用route.fallback()方法,允许请求继续发送和接收响应。这里没有匹配到,触发回退行为,允许请求正常继续。

fetch

执行请求并在不满足的情况下获取结果,以便可以修改响应,然后完成响应。

from playwright.sync_api import sync_playwright
def handle(route):
    response = route.fetch()
    json = response.json()
    json["message"]["big_red_dog"] = []
    route.fulfill(response=response, json=json)


with sync_playwright() as playwright:
    browser = playwright.chromium.launch()
    page = browser.new_page()

    page.route("https://dog.ceo/api/breeds/list/all", handle)

    browser.close()

这个例子实现给响应json数据增加 json["message"]["big_red_dog"] = [] 

fulfill 

`route.fulfill(response: FulfillOptions): Promise<void>` - 使用自定义的响应对象来履行请求。响应对象包含状态码、头信息和响应体等。

Route类的fulfill()方法用于模拟完成请求,即手动提供响应数据并结束请求 

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.pause()

    browser.close()

在上面的示例中,我们创建了一个简单的Playwright脚本。我们使用 page.route() 方法来监听和拦截所有的请求。在 intercept_request 函数中,我们根据请求的URL进行条件判断。如果请求的URL以 “https://dog.ceo/api/breeds/list/all” 开头,我们打印一条拦截消息,并调用 route.fulfill() 方法来模拟完成请求。我们提供了状态码(status)、响应体(body)和响应头(headers)作为参数。通过这些参数可以自定义所提供的响应。

在示例中,我们模拟了一个状态码为200的响应,响应体是 {"message": "Hello, World!"},并且设置了Content-Typeapplication/json的响应头。

当运行这个脚本时,请求到 “https://dog.ceo/api/breeds/list/all

” 的请求会被拦截,并使用自定义的响应数据进行模拟完成。对于其他请求,将被允许正常进行。

请注意,如果请求不符合拦截条件,需要调用 route.continue_() 方法允许请求正常进行。

页面默认的响应

 

修改后的响应

 

 

属性

request

匹配到的request

 

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

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

相关文章

hive--给表名和字段加注释

1.建表添加注释 CREATE EXTERNAL TABLE test(loc_province string comment 省份,loc_city string comment 城市,loc_district string comment 区,loc_street string comment 街道,)COMMENT 每日数据处理后的表 PARTITIONED BY (par_dt string) ROW FORMAT SERDEorg.apache.had…

SpringBoot ⽇志⽂件

日志 1. 作用2. 日志的使用3. 日志的级别4. 日志的持久化 1. 作用 日志最主要的⽤途就是排除和定位问题。 除了发现和定位问题之外&#xff0c;我们还可以通过⽇志实现以下功能&#xff1a; 记录⽤户登录⽇志&#xff0c;⽅便分析⽤户是正常登录还是恶意破解⽤户。记录系统的…

【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接

更多有关博主写的往期Elasticsearch文章 标题地址【ElasticSearch 集群】Linux安装ElasticSearch集群&#xff08;图文解说详细版&#xff09;https://masiyi.blog.csdn.net/article/details/131109454基于SpringBootElasticSearch 的Java底层框架的实现https://masiyi.blog.c…

如何在 Elasticsearch 中将矢量搜索与过滤结合起来 - Python 8.x

大型语言模型&#xff08;LLM&#xff09;每天都在发展&#xff0c;这种情况有助于语义搜索的扩展。 LLM 擅长分析文本和揭示语义相似性。 这种情况也反映在搜索引擎上&#xff0c;因为语义搜索引擎可以为用户提供更满意的结果。 尽管大型语言模型可以捕获语义上接近的结果&am…

zabbix整合prometheus的数据

1 zabbix安装 官方文档参考 https://www.zabbix.com/download?zabbix6.0&os_distributioncentos&os_version7&componentsproxy&dbmysql&ws https://www.zabbix.com/download?zabbix4.0&os_distributioncentos&os_version7&componentsserver…

【抖音直播小玩法】介绍

一、是什么 直播小玩法是基于抖音直播场景的新型实时互动内容。直播小玩法由开发者自主开发&#xff0c;接入平台并开放给抖音主播挂载使用。开发者提供创意&#xff0c;依托平台生态&#xff0c;获取收益。 介入标准&#xff1a; 企业开发者&#xff0c;暂不支持个人开发者…

8.文件存储空间管理

第四章 文件管理 8.文件存储空间管理 空闲表法&#xff1a;   空闲盘块表和在内存管理的动态分区分配中学习过的空闲分区表是类似的&#xff0c;空闲盘块表记录了每一个空闲区间的起始位置和这个空闲区间的长度这两个信息。像第一个空闲区间是0&#xff0c;1这两个空闲块&am…

【克罗恩病是银屑病及银屑病关节炎的因果风险因素】

克罗恩病是银屑病及银屑病关节炎的因果风险因素 ①纳入463372名欧洲人&#xff0c;包括12882例IBD患者、5621例银屑病患者、2063例银屑病关节炎患者&#xff1b;②单变量孟德尔随机化&#xff08;MR&#xff09;分析表明&#xff0c;基于遗传因素预测的IBD与较高的银屑病和银屑…

复数混频器、零中频架构和高级算法开发

文章里讲解了关于射频IQ调制器、零中频架构相关的原理及技术&#xff0c;全都是干货&#xff01;其实好多同行对软件无线电的原理、IQ调制、镜像抑制都是一知半解&#xff0c;知其然不知其所以然。好好研读这篇文章&#xff0c;相信会让你有种恍然大悟的感觉。 RF工程常被视为…

【Selenium学习】环境搭建 API学习

目录 一、javaSelenium的环境搭建&#xff1f; 二、认识Selenium 1、什么是自动化&#xff1f; 2、什么是Selenium? (重点) 3、selenium的工作原理&#xff1f;&#xff08;重点&#xff09; 三、Selenium操作元素API&#xff08;重点&#xff09; 第一部分&#…

【数据结构OJ题】合并两个有序链表

原题链接&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 可以先创建一个空链表&#xff0c;然后依次从两个有序链表中选取最小的进行尾插操作。&#xff08;有点类似双…

【数据结构OJ题】环形链表

原题链接&#xff1a;https://leetcode.cn/problems/linked-list-cycle/description/ 1. 题目描述 2. 思路分析 整体思路&#xff1a;定义快慢指针fast&#xff0c;slow&#xff0c;如果链表确实有环&#xff0c;fast指针一定会在环内追上slow指针。 即慢指针一次走一步&…

分布式 | 如何搭建 DBLE 的 JVM 指标监控系统

本篇文章采用 Docker 方式搭建 Grafana Prometheus 实现对 DBLE 的 JVM 相关指标的监控系统。 作者&#xff1a;文韵涵 爱可生 DBLE 团队开发成员&#xff0c;主要负责 DBLE 需求开发&#xff0c;故障排查和社区问题解答。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&a…

“开发和运维”只是一个开始,最终目标是构建高质量的软件工程

随着技术的飞速发展&#xff0c;软件行业不断寻求改进和创新的方法来提供更高质量的产品。在这方面&#xff0c;DevOps已经展现出了巨大的潜力。通过打破开发和运维之间的壁垒&#xff0c;DevOps将持续集成、持续交付和自动化流程引入到软件开发中&#xff0c;使团队能够更快地…

PSP - 开源可训练的蛋白质结构预测框架 OpenFold 的环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132334671 Paper: OpenFold: Retraining AlphaFold2 yields new insights into its learning mechanisms and capacity for generalization Open…

循环队列的实现(c语言)

前言 循环队列是队列的一种特殊的结构&#xff0c;在生产者——消费者模型中常常使用它&#xff0c; 它在逻辑上是一个环形的连续的结构。在物理可以使用数组来实现。 目录 1.循环队列的逻辑结构 2.空的循环队列和满的循环队列 3.循环队列插入和删除 4.代码实现 …

关于小程序收集用户手机号行为的规范

手机号在日常生活中被广泛使用&#xff0c;是重要的用户个人信息&#xff0c;小程序开发者应在用户明确同意的前提下&#xff0c;依法合规地处理用户的手机号信息。 而部分开发者在处理用户手机号过程中&#xff0c;存在不规范收集行为&#xff0c;影响了用户的正常使用体验&a…

如何使用ChatGPT创建个性化的健身锻炼计划

ChatGPT广泛应用于各个行业&#xff0c;健身也不例外。 ChatGPT 在健身领域的一个常用案例是创建个性化的锻炼计划。 在要求 ChatGPT 创建锻炼计划时&#xff0c;简单地输入自己的目标和当前的健身水平是一个很好的开始。完成此操作后&#xff0c;你还可以使用其他提示和措施来…

视频汇聚集中存储EasyCVR平台调用iframe地址视频无法播放,该如何解决?

安防监控视频汇聚平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝…

Git 删除 GitHub仓库的文件

新建文件夹 git bash here 在新建的文件夹里右键git bash here打开终端&#xff0c;并执行git init初始化仓库 git clone <你的地址> 找到github上要删除的仓库地址&#xff0c;并复制&#xff0c;在终端里输入git clone <你的地址> 要删除文件的库里右键git b…