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

在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

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值