python+playwright自动化测试(六):设置代理及网络监听和数据拦截修改

部署运行你感兴趣的模型镜像

目录

HTTP身份认证

HTTP(S) 代理

launch中的proxy参数设置(全局代理)

launch_persistent_context中设置

使用环境变量设置代理

事件监控

数据拦截及修改


HTTP身份认证

context = browser.new_context(
    http_credentials={"username": "2025110155", "password": "123456"}
)
page = context.new_page()

HTTP(S) 代理

launch中的proxy参数设置(全局代理)

browser = chromium.launch(proxy={
    "server": "http://myproxy.com:8088",
    "username": "us",
    "password": "pd"
})

launch_persistent_context中设置

要在固定的上下文中使用代理,可以使用launch_persistent_context()方法

browser = playwright.chromium.launch_persistent_context('path/to/context', proxy={'server': 'http://your-proxy-server:port'})

使用环境变量设置代理

这种方式可以在不修改代码的情况下改变代理设置。

import os
os.environ['HTTP_PROXY'] = 'http://your_proxy_address:your_proxy_port'
os.environ['HTTPS_PROXY'] = 'http://your_proxy_address:your_proxy_port'

事件监控

playwright中的page.on提供了多种事件的捕获监控,如下:

Page.on(self: Page, event: Literal["close"], f: (Page) -> None) 页面关闭事件
Page.on(self: Page, event: Literal["console"], f: (ConsoleMessage) -> None) 页面上发生控制台日志事件。
Page.on(self: Page, event: Literal["crash"], f: (Page) -> None) 页面崩溃事件。
Page.on(self: Page, event: Literal["dialog"], f: (Dialog) -> None) 页面弹出对话框事件。
Page.on(self: Page, event: Literal["domcontentloaded"], f: (Page) -> None) DOM 内容加载完成事件。
Page.on(self: Page, event: Literal["download"], f: (Download) -> None) 页面上触发下载事件。
Page.on(self: Page, event: Literal["filechooser"], f: (FileChooser) -> None) 页面弹出文件选择对话框事件。
Page.on(self: Page, event: Literal["frameattached"], f: (Frame) -> None) 子框架附加到页面事件。
Page.on(self: Page, event: Literal["framedetached"], f: (Frame) -> None) 子框架从页面分离事件。
Page.on(self: Page, event: Literal["framenavigated"], f: (Frame) -> None) 子框架导航事件。
Page.on(self: Page, event: Literal["load"], f: (Page) -> None) 页面加载完成事件。
Page.on(self: Page, event: Literal["pageerror"], f: (Error) -> None) 页面上发生错误事件。
Page.on(self: Page, event: Literal["popup"], f: (Page) -> None) 页面弹出弹出窗口事件。
Page.on(self: Page, event: Literal["request"], f: (Request) -> None) 页面发出网络请求事件。
Page.on(self: Page, event: Literal["requestfailed"], f: (Request) -> None) 页面上的请求失败事件。
Page.on(self: Page, event: Literal["requestfinished"], f: (Request) -> None) 页面上的请求完成事件。
Page.on(self: Page, event: Literal["response"], f: (Response) -> None) 页面接收到网络响应事件。
Page.on(self: Page, event: Literal["websocket"], f: (WebSocket) -> None) 页面上发生 WebSocket 事件。
Page.on(self: Page, event: Literal["worker"], f: (Worker) -> None) 页面上发生 Worker 事件。
from playwright.sync_api import sync_playwright, Playwright, expect
from functools import partial

def on_close(event, par1, par2):
    print(f'页面关闭了{event}{par1}{par2}')

def on_request(request, extra_param):
    if request.url.endswith('.js'):
        print(f"存在还有JavaScript请求,Request URL: {request.url}, Extra Param: {extra_param}")


def documentManage(playwright: Playwright, url):
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context(storage_state="cookies.json")  # 传入storage_state参数,加载cookies
    page = context.new_page()
    page.goto(url, wait_until='commit', timeout=50000)
    page.set_viewport_size({'width': 1920, 'height': 1080})

    page.reload()  # 刷新页面
 
    # 通过url支持获取URL、js、css、图片等资源文件链接;status 获取请求结果状态;headers 获取请求头

    page.on('request', lambda request: print(request.url))
    page.on('response', lambda response: print(response.json()))
    page.on('request', lambda request: on_request(request, extra_param='测试闭包传参'))
    page.on('close', partial(on_close, par1=123, par2='测试'))


    page.wait_for_timeout(2000)
    context.close()
    browser.close()

上面代码中使用了from functools import partial,解决事件监控时的函数传参问题,监控函数第一个传参为事件本身,如on_close中的event实际代表close。当然后面的网络拦截中也适用。

数据拦截及修改

中止请求使用route.abort()

    page.route('**/*.{png,jpg}', lambda route: route.abort())  # lambda函数中可以加条件判断语句来控制需要拦截的特定内容
    page.route("**/*", lambda route: route.abort() if 'documentManage' in route.request.url else route.continue_())

修改响应数据通过使用 APIRequestContext 获取原始响应,然后将响应传递给 route.fulfill()。

    page.route('**/*', lambda route: route.fulfill(
        status=200,
        body='{"message": "数据被拦截且修改"}'
    ))

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值