Playwright request.sizes()在缓存/Azure Blob请求中返回负responseBodySize是否正常?
关于Playwright request.sizes()返回负responseBodySize的问题
这种情况属于预期行为,原因对应你遇到的两种场景:
1. 缓存命中的请求
当资源直接从浏览器缓存读取时,没有发生实际的网络响应体传输。Playwright的request.sizes().responseBodySize统计的是通过网络接收的响应体字节数,缓存命中时这部分数据为0,但框架会用负值(通常是-1)明确标记“无网络传输”的状态,而非单纯返回0。
2. Azure Blob图片请求
这类场景出现负值通常和以下因素有关:
- 范围请求(Range Requests):Azure Blob服务可能返回
206 Partial Content状态码,响应体只是资源的一部分,Playwright统计这类分段响应时易出现数值异常。 - 流式传输或响应头缺失:Blob图片的响应可能采用流式传输,或者服务端未返回准确的
Content-Length头,导致Playwright无法完整统计响应体大小,最终返回负值。
处理建议
可以在代码中对负值情况做针对性处理:
- 结合
response.fromCache()判断缓存命中,将size设为0或标记为“来自缓存”。 - 针对Blob或范围请求,检查响应状态码(如206),尝试从响应头的
Content-Length或Content-Range字段计算实际大小,替代request.sizes()的结果。
修改后的代码示例
const handleRequest = async request => { const initiatorFrame = request.frame(); const initiatorFrameUrl = initiatorFrame ? initiatorFrame.url() : "Unknown"; const response = await request.response(); if (response) { const responseSizes = await request.sizes(); let size = responseSizes.responseBodySize; // 处理缓存命中的情况 if (response.fromCache()) { size = 0; } // 处理负值异常 else if (size < 0) { const contentLength = response.header("Content-Length"); size = contentLength ? parseInt(contentLength) : 0; } const requestEntry = { method: request.method(), domain: new URL(request.url()).hostname, url: request.url(), size: size, status: response.status(), statusSuccess: response.ok(), fromServiceWorker: response.fromServiceWorker(), resourceType: response.request().resourceType(), frame: initiatorFrameUrl, fromCache: response.fromCache() }; entries.push(requestEntry); } else { console.log("No response from ", request.url()); } };
内容的提问来源于stack exchange,提问作者Divyani Joshi
相关产品推荐
相关产品推荐

