在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-Type
为application/json
的响应头。
当运行这个脚本时,请求到 “https://dog.ceo/api/breeds/list/all
” 的请求会被拦截,并使用自定义的响应数据进行模拟完成。对于其他请求,将被允许正常进行。
请注意,如果请求不符合拦截条件,需要调用 route.continue_()
方法允许请求正常进行。
页面默认的响应
修改后的响应
属性
request
匹配到的request