最强自动化测试框架Playwright(37)-网络

介绍

Playwright 提供 API 来监控修改浏览器网络流量,包括 HTTP 和 HTTPS。页面执行的任何请求,包括 XHR 和获取请求,都可以被跟踪、修改和处理。

模拟接口

查看我们的 API 模拟指南,了解有关如何

  • 模拟 API 请求,从不命中 API
  • 执行 API 请求并修改响应
  • 使用 HAR 文件模拟网络请求。

HTTP身份验证

执行 HTTP 身份验证。

  • 同步
context = browser.new_context(http_credentials={"username": "bill", "password": "pa55w0rd"}
)
page = context.new_page()
page.goto("https://example.com")

HTTP 代理

您可以将页面配置为通过 HTTP(S) 代理或 SOCKSv5 加载。可以为整个浏览器全局设置代理,也可以为每个浏览器上下文单独设置代理。

您可以选择为 HTTP(S) 代理指定用户名和密码,也可以指定要绕过代理的主机。

下面是全局代理的示例:

  • 同步
browser = chromium.launch(proxy={"server": "http://myproxy.com:3128","username": "usr","password": "pwd"
})

当为每个上下文单独指定代理时,Windows 上的 Chromium 需要一个提示,指示将设置代理。这是通过将非空代理服务器传递给浏览器本身来完成的。下面是特定于上下文的代理的示例:

  • 同步
# Browser proxy option is required for Chromium on Windows.
browser = chromium.launch(proxy={"server": "per-context"})
context = browser.new_context(proxy={"server": "http://myproxy.com:3128"})

网络事件

您可以监视所有请求和响应:

  • 同步
from playwright.sync_api import sync_playwrightdef run(playwright):chromium = playwright.chromiumbrowser = chromium.launch()page = browser.new_page()# Subscribe to "request" and "response" events.page.on("request", lambda request: print(">>", request.method, request.url))page.on("response", lambda response: print("<<", response.status, response.url))page.goto("https://example.com")browser.close()with sync_playwright() as playwright:run(playwright)

 

或者等待按钮单击后page.expect_response()的网络响应:

# Use a glob url pattern
with page.expect_response("**/api/fetch_data") as response_info:page.get_by_text("Update").click()
response = response_info.value
# Use a regular expression
with page.expect_response(re.compile(r"\.jpeg$")) as response_info:page.get_by_text("Update").click()
response = response_info.value# Use a predicate taking a response object
with page.expect_response(lambda response: token in response.url) as response_info:page.get_by_text("Update").click()
response = response_info.value

处理请求

page.route("**/api/fetch_data",lambda route: route.fulfill(status=200, body=test_data))
page.goto("https://example.com")

修改请求

# Delete header
def handle_route(route):headers = route.request.headersdel headers["x-secret"]route.continue_(headers=headers)
page.route("**/*", handle_route)# Continue requests as POST.
page.route("**/*", lambda route: route.continue_(method="POST"))

您可以通过修改继续请求。上面的示例从传出请求中删除 HTTP 标头。

终止请求

您可以使用 page.route() 和 route.abort() 中止请求。

page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())# Abort based on the request type
page.route("**/*", lambda route: route.abort() if route.request.resource_type == "image"  else route.continue_())

修改响应

要修改响应,请使用 APIRequestContext 获取原始响应,然后将响应传递给 route.fulfill()。您可以通过以下选项覆盖响应上的各个字段:

def handle_route(route: Route) -> None:# Fetch original response.response = route.fetch()# Add a prefix to the title.body = response.text()body = body.replace("<title>", "<title>My prefix:")route.fulfill(# Pass all fields from the response.response=response,# Override response body.body=body,# Force content type to be html.headers={**response.headers, "content-type": "text/html"},)page.route("**/title.html", handle_route)

网络套接字

Playwright支持开箱即用的WebSockets检查。每次创建 WebSocket 时,都会触发 page.on(“websocket”) 事件。此事件包含用于进一步检查 Web 套接字帧的 WebSocket 实例:

def on_web_socket(ws):print(f"WebSocket opened: {ws.url}")ws.on("framesent", lambda payload: print(payload))ws.on("framereceived", lambda payload: print(payload))ws.on("close", lambda payload: print("WebSocket closed"))page.on("websocket", on_web_socket)

使用Playwright框架来监听WebSocket事件的Python代码示例如下:

from playwright.sync_api import sync_playwrightdef on_websocket(event, websocket):websocket.on('socket', print)websocket.on('close', print)with sync_playwright() as p:browser_type = p.chromiumbrowser = browser_type.launch()context = browser.new_context()page = context.new_page()page.route("**/websocket_endpoint", on_websocket)page.goto('https://example.com')# 执行其他操作...browser.close()
```

在上述示例中:
 创建一个新的页面,并使用`page.route`方法来监听符合指定URL规则的WebSocket事件。在这个例子中,我们设置URL规则为`**/websocket_endpoint`,您需要根据实际情况替换为您要监听的WebSocket端点。

缺少网络事件和服务工作线程

Playwright的内置browser_context.route()和page.route()允许你的测试在本地路由请求并执行模拟和拦截。

  1. 如果您使用的是 Playwright 的本机 browser_context.route() 和 page.route(),并且似乎缺少网络事件,请通过将 设置为 来禁用 Service Worker 。browser.new_context.service_workers'block'
  2. 可能是您正在使用模拟工具,例如模拟服务辅助角色 (MSW)。虽然此工具开箱即用地用于模拟响应,但它添加了自己的 Service Worker 来接管网络请求,从而使它们对 browser_context.route() 和 page.route() 不可见。如果您对网络测试和模拟都感兴趣,请考虑使用内置的 browser_context.route() 和 page.route() 进行响应模拟。
  3. 如果您不仅对使用 Service Worker 进行测试和网络模拟感兴趣,还对路由和侦听 Service Worker 自己发出的请求感兴趣,请参阅此实验性功能。

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

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

相关文章

Sentinel规则持久化

首先 Sentinel 控制台通过 API 将规则推送至客户端并更新到内存中&#xff0c;接着注册的写数据源会将新的规则保存到本地的文件中。 示例代码&#xff1a; 1.编写处理类 //规则持久化 public class FilePersistence implements InitFunc {Value("spring.application:n…

java+springboot+mysql银行管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的银行管理系统&#xff0c;系统包含超级管理员、管理员、客户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;客户管理&#xff1b;卡号管理&#xff08;存款、取款、转账&#xff09…

GRPC 学习记录

GRPC 安装 安装 grpcio、grpcio-tools、protobuf、 pip install grpcio -i https://pypi.tuna.tsinghua.edu.cn/simple pip install grpcio-tools -i https://pypi.tuna.tsinghua.edu.cn/simple pip install protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple常用类型 p…

pytorch3d成功安装

一、pytorch3d是什么&#xff1f; PyTorch3D的目标是帮助加速深度学习和3D交叉点的研究。3D数据比2D图像更复杂&#xff0c;在从事Mesh R-CNN和C3DPO等项目时&#xff0c;我们遇到了一些挑战&#xff0c;包括3D数据表示、批处理和速度。我们开发了许多有用的算子和抽象&#xf…

tauri-react:快速开发跨平台软件的架子,支持自定义头部UI拖拽移动和窗口阴影效果

tauri-react 一个使用 taurireacttsantd 开发跨平台软件的模板&#xff0c;支持窗口头部自定义和窗口阴影&#xff0c;不用再自己做适配了&#xff0c;拿来即用&#xff0c;非常 nice。而且已经封装好了 tauri 的 http 请求工具&#xff0c;省去很多弯路。 开原地址&#xff…

如何基于 ACK Serverless 快速部署 AI 推理服务

作者&#xff1a;元毅 随着 AI 浪潮的到来&#xff0c;各种 AI 应用层出不穷&#xff0c;众所周知 AI 应用对 GPU 资源强烈依赖&#xff0c;但 GPU 很昂贵&#xff0c;如何降低 GPU 资源使用成本成为用户首要问题。而 AI 与 Serverless 技术结合&#xff0c;完全可以达到按需使…

Electron入门,项目启动。

electron 简单介绍&#xff1a; 实现&#xff1a;HTML/CSS/JS桌面程序&#xff0c;搭建跨平台桌面应用。 electron 官方文档&#xff1a; [https://electronjs.org/docs] 本文是基于以下2篇文章且自行实践过的&#xff0c;可行性真实有效。 文章1&#xff1a; https://www.cnbl…

高效mac常用快捷键整理

高效mac常用快捷键整理 macOS全局、剪切、拷贝、粘贴finder 和 系统快捷键文稿 浏览器chrome标签页和窗口快捷键功能快捷键网页快捷键 Idea & Pycharm必记编辑查询&替换导航重构编译、运行、调试 iTerm标签分屏编辑 文本编辑 sublime text导航&#xff1a;打开&关闭…

springcloud3 hystrix实现服务监控显示3(了解)

一 hystrix的服务监控调用 1.1 hystrix的服务监控调用 hystrix提供了准实时的监控调用&#xff08;hystrix dashbord&#xff09;&#xff0c;Hystrix 会持续的记录所有通过hystrix发送的请求的执行信息&#xff0c;并以统计报表和图形的形式展示给用户&#xff0c;包括每秒执…

安装和配置 Ansible

安装和配置 Ansible 按照下方所述&#xff0c;在控制节点 control.area12.example.com 上安装和配置 Ansible&#xff1a; 安装所需的软件包 创建名为 /home/curtis/ansible/inventory 的静态清单文件&#xff0c;以满足以下要求&#xff1a; node1 是 dev 主机组的成员 node2 …

【面试题】2、Docker和Spring相关

1、Docker是什么&#xff1f; &#xff08;1&#xff09;Docker是一个快速交互、运行应用的技术&#xff0c;可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;该镜像可以迁移到任意的Linux操作系统 &#xff08;2&#xff09;运行时利用沙箱机制形成隔离容器&…

docker打包运行中的容器,生成镜像文件保存到本地

因为想着方便部署&#xff0c;将所有没问题的项目容器打包成镜像&#xff0c;走到哪儿都离线安装自动部署。 第一步先把运行中的容器打包成镜像 docker commit 运行中容器id 像打包成的镜像名称第二步将大象装进冰箱&#xff0c;不好意思说错了&#xff0c;把镜像保存到本地 …

vue3 + antv/x6 实现拖拽侧边栏节点到画布

前篇&#xff1a;vue3ts使用antv/x6 自定义节点 前篇&#xff1a;vue3antv x6自定义节点样式 1、创建侧边栏 用antd的menu来做侧边栏 npm i --save ant-design-vue4.x//入口文件main.js内 import Antd from ant-design-vue; import App from ./App; import ant-design-vue/…

Java SpringBoot Vue ERP系统

系统介绍 该ERP系统基于SpringBoot框架和SaaS模式&#xff0c;支持多租户&#xff0c;专注进销存财务生产功能。主要模块有零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询、系统管理等。支持预付款、收入支出、仓库调拨、组装拆卸、订单等特色功能。拥有商品库存…

用户订阅付费如何拆解分析?看这篇就够了

会员制的订阅付费在影音娱乐行业中已相当普及&#xff0c;近几年&#xff0c;不少游戏厂商也开始尝试订阅收费模式。在分析具体的用户订阅偏好以及订阅付费模式带来的增长效果时&#xff0c;我们常常会有这些疑问&#xff1a; 如何从用户的整体付费行为中具体拆解订阅付费事件…

Unity用NPOI创建Exect表,保存数据,和修改删除数据。以及打包后的坑——无法打开新创建的Exect表

先说坑花了一下午才找到解决方法解决&#xff0c; 在Unity编辑模式下点击物体创建对应的表&#xff0c;获取物体名字与在InputText填写的注释数据。然后保存。创建Exect表可以打开&#xff0c;打包PC后&#xff0c;点击物体创建的表&#xff0c;打不开文件破损 解决方法&#…

Java进阶篇--迭代器模式

目录 同步迭代器&#xff08;Synchronous Iterator&#xff09;&#xff1a; Iterator 接口 常用方法&#xff1a; 注意&#xff1a; 扩展小知识: 异步迭代器&#xff08;Asynchronous Iterator&#xff09;&#xff1a; 常用的方法 注意&#xff1a; 总结&#xff1a…

记一次fegin调用的媒体类型问题

1.问题&#xff1a;分页查询&#xff0c;分页参数传递不生效 2.开发环境&#xff1a;fegin接口 开发环境&#xff1a;调用接口 3.修改后&#xff1a;fegin接口不变 调用接口 前端媒体类型&#xff1a; 问题解决&#xff01;&#xff01;&#xff01; 4.原因分析&…

开源数据库Mysql_DBA运维实战 (备份与还原)

Mysql数据库的备份与还原&#x1f343; 备份对于数据库而言是至关重要的。当数据文件发生损坏、MySQL服务出现错误、系统内核崩溃、计算机硬件损坏或者数据被误删等事件时&#xff0c;使用一种有效的数据备份方案&#xff0c;就可以快速解决以上所有的问题。MySQL提供了多种备…

mongodb数据库

目录 一、数据库 二、文档 三、集合 四、元数据 五、MongoDB 数据类型 1、ObjectId 2、字符串 3、时间戳 4、日期 一、数据库 一个 mongodb 中可以建立多个数据库。 MongoDB 的默认数据库为"db"&#xff0c;该数据库存储在 data 目录中。 MongoDB 的单…