Playwright实现网络流量监控与修改指南

 更新时间:2025年08月04日 08:39:17   作者:蛋仔聊测试  
Playwright 提供了强大的网络流量控制能力,可以拦截、修改和分析所有 HTTP/HTTPS 请求,下面我们就来看看如何使用Playwright监控网络流量吧

Playwright 提供了强大的网络流量控制能力,可以拦截、修改和分析所有 HTTP/HTTPS 请求。下面我将详细介绍各种使用方法和底层原理。

一、基本网络监控

1. 记录所有请求

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    
    # 监听请求和响应事件
    def print_request(request):
        print(f">> Request: {request.method} {request.url}")
    
    def print_response(response):
        print(f"<< Response: {response.status} {response.url}")
    
    page.on("request", print_request)
    page.on("response", print_response)
    
    page.goto("https://example.com")
    
    browser.close()

2. 获取请求详细信息

def log_request(request):
    print(f"""
    Request: {request.method} {request.url}
    Headers: {request.headers}
    Post Data: {request.post_data}
    Resource Type: {request.resource_type}
    Navigation: {request.is_navigation_request()}
    """)

page.on("request", log_request)

二、网络请求修改

1. 修改请求头

async def modify_headers(route):
    headers = route.request.headers.copy()
    headers["x-custom-header"] = "my-value"
    await route.continue_(headers=headers)

await page.route("**/*", modify_headers)

2. 修改请求体

async def modify_post_data(route):
    if route.request.method == "POST":
        post_data = route.request.post_data
        modified_data = post_data.replace("old", "new")
        await route.continue_(post_data=modified_data)
    else:
        await route.continue_()

await page.route("**/api/**", modify_post_data)

3. 拦截并返回模拟响应

async def mock_response(route):
    await route.fulfill(
        status=200,
        content_type="application/json",
        body=json.dumps({"data": "mocked"})
    )

await page.route("**/api/data", mock_response)

三、高级网络控制

1. 延迟响应

async def delay_response(route):
    await asyncio.sleep(2)  # 延迟2秒
    await route.continue_()

await page.route("**/*.css", delay_response)

2. 阻止特定请求

async def block_analytics(route):
    if "google-analytics" in route.request.url:
        await route.abort()
    else:
        await route.continue_()

await page.route("**/*", block_analytics)

3. 修改响应

async def modify_response(route):
    response = await route.fetch()
    body = await response.text()
    modified_body = body.replace("Original", "Modified")
    await route.fulfill(
        response=response,
        body=modified_body
    )

await page.route("**/api/content", modify_response)

四、底层运行原理

1. 整体架构

+-------------------+     +-------------------+     +-------------------+
|   Playwright      |     |   Browser         |     |   Remote Server   |
|   Python Client   |<--->|   (Chromium/etc)  |<--->|   (example.com)   |
+-------------------+     +-------------------+     +-------------------+
        |                       ^    ^
        | CDP (Chrome DevTools) |    |
        | WebSocket Connection |    | Actual Network Traffic
        v                       |    |
+-------------------+           |    |
|   Network Proxy   |-----------+    |
|   Layer           |----------------+
+-------------------+

2. 请求生命周期

1.初始化阶段:

  • 当调用 page.route() 时,Playwright 会在浏览器中设置请求拦截器
  • 通过 CDP 的 Fetch 域启用请求拦截

2.请求拦截流程:

sequenceDiagram
    participant Page
    participant Playwright
    participant Browser
    
    Page->>Browser: 发起请求
    Browser->>Playwright: 触发请求拦截 (Fetch.requestPaused)
    Playwright->>Python: 调用注册的路由处理器
    alt 继续请求
        Python->>Playwright: route.continue_()
        Playwright->>Browser: 继续请求到服务器
    else 模拟响应
        Python->>Playwright: route.fulfill()
        Playwright->>Browser: 返回模拟响应
    else 中止请求
        Python->>Playwright: route.abort()
        Playwright->>Browser: 中止请求
    end

3.修改请求流程:

Playwright 使用中间人技术拦截请求

可以修改的部分包括:

  • URL
  • 方法 (GET/POST等)
  • 请求头
  • 请求体
  • 重定向行为

4.响应处理流程:

对于 route.fetch() 操作:

  • Playwright 会实际发送请求到服务器
  • 获取响应后允许修改再返回给页面

对于 route.fulfill() 操作:

  • 直接构造响应返回给浏览器
  • 不接触真实服务器

3. 关键技术点

1.请求匹配系统:

  • 使用 glob 模式或正则表达式匹配 URL
  • 可以按资源类型 (XHR, stylesheet, image等) 过滤

2.内存管理:

  • 每个路由处理器都保持引用直到手动取消
  • 需要调用 page.unroute() 避免内存泄漏

3.安全机制:

  • HTTPS 拦截需要 Playwright 安装自己的 CA 证书
  • 修改后的请求仍保持安全特性
  • 遵循同源策略和 CORS 规则

4.性能优化:

  • 拦截器运行在浏览器进程中
  • 最小化 Python 和浏览器之间的通信
  • 批量处理多个请求

五、实际应用示例

1. API 测试模拟

async def test_api(page):
    async def handle_api(route):
        if route.request.method == "POST":
            await route.fulfill(
                status=201,
                json={"id": 123, "status": "created"}
            )
        else:
            await route.continue_()
    
    await page.route("**/api/users*", handle_api)
    
    # 测试代码
    await page.goto("https://app.example.com")
    await page.click("#create-user")
    assert await page.text_content(".status") == "User 123 created"

2. 性能分析

async def analyze_performance(page):
    requests = []
    
    def log_request(request):
        requests.append({
            "url": request.url,
            "start": time.time(),
            "type": request.resource_type
        })
    
    def log_response(response):
        for req in requests:
            if req["url"] == response.url:
                req["duration"] = time.time() - req["start"]
                req["status"] = response.status
    
    page.on("request", log_request)
    page.on("response", log_response)
    
    await page.goto("https://example.com")
    
    # 输出性能报告
    slow_requests = [r for r in requests if r.get("duration", 0) > 1]
    print(f"Slow requests: {len(slow_requests)}/{len(requests)}")

3. 认证处理

async def handle_auth(page):
    await page.route("**/api/**", lambda route: route.continue_(
        headers={**route.request.headers, "Authorization": "Bearer xyz"}
    ))
    
    await page.goto("https://app.example.com")
    # 所有API请求会自动带上认证头

六、最佳实践

1.精确路由匹配:

  • 避免使用太宽泛的 **/* 模式
  • 结合 URL 和资源类型进行过滤

2.清理路由:

# 添加路由
await page.route("**/api/**", handler)

# 测试完成后移除
await page.unroute("**/api/**", handler)

3.错误处理:

async def safe_handler(route):
    try:
        await route.continue_()
    except Exception as e:
        print(f"Failed to handle {route.request.url}: {e}")
        await route.abort()

4.性能敏感操作:

  • 对于大量请求,考虑在 Python 端实现缓存
  • 避免在路由处理器中进行复杂计算

5.调试技巧:

# 打印未处理的请求
page.on("request", lambda r: print("Unhandled:", r.url))

Playwright 的网络拦截 API 提供了对浏览器网络活动的完全控制,使得测试复杂 web 应用变得更加容易,特别是在需要模拟各种网络条件或测试边缘情况时。理解其底层原理有助于更有效地使用这些功能。

到此这篇关于Playwright实现网络流量监控与修改指南的文章就介绍到这了,更多相关Playwright网络流量监控内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用Python按时间分割txt文件中的数据方法步骤

    用Python按时间分割txt文件中的数据方法步骤

    这篇文章主要给大家介绍了如何用Python按时间分割txt文件中的数据的方法步骤,文中通过代码示例给大家讲解的非常详细,对大家学习Python处理txt文件有一定的帮助,需要的朋友可以参考下
    2023-12-12
  • 在Python中通过getattr获取对象引用的方法

    在Python中通过getattr获取对象引用的方法

    今天小编就为大家分享一篇在Python中通过getattr获取对象引用的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境

    python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境

    这篇文章主要介绍了python 通过pip freeze、dowload打离线包及自动安装【适用于保密的离线环境】,本文通图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • python pandas模块进行数据分析

    python pandas模块进行数据分析

    Python的Pandas模块是一个强大的数据处理工具,可以用来读取、处理和分析各种数据,本文主要介绍了python pandas模块进行数据分析,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • web.py获取上传文件名的正确方法

    web.py获取上传文件名的正确方法

    这篇文章主要介绍了web.py获取上传文件名的正确方法,遇到这个问题的朋友可能会困惑半天,使用本文的正确方法就可以解决这个问题了,需要的朋友可以参考下
    2014-08-08
  • Python离线安装openpyxl模块的步骤

    Python离线安装openpyxl模块的步骤

    这篇文章主要介绍了Python离线安装openpyxl模块的步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • python如何将aac转为mp3,保持原有目录结构

    python如何将aac转为mp3,保持原有目录结构

    使用Python脚本实现AAC格式转MP3格式的方法介绍,需要用户输入AAC文件所在目录路径和MP3输出目录路径,通过调用FFmpeg工具实现格式转换,该脚本简单易懂,适合需要批量处理音频文件的用户,使用前需确保已安装FFmpeg环境
    2024-11-11
  • python授权加密的几种常见方案

    python授权加密的几种常见方案

    文章介绍了几种提高软件授权码安全性的方法,包括使用非对称加密、硬件绑定、时间限制、HMAC或对称加密以及使用在线授权服务器,建议企业级产品采用服务器+本地加密结合的方式,感兴趣的朋友一起看看吧
    2025-03-03
  • git查看、创建、删除、本地、远程分支方法详解

    git查看、创建、删除、本地、远程分支方法详解

    这篇文章主要介绍了git查看、创建、删除、本地、远程分支方法详解,需要的朋友可以参考下
    2020-02-02
  • 20行python代码的入门级小游戏的详解

    20行python代码的入门级小游戏的详解

    这篇文章主要介绍了python入门级小游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论