问题描述
我处于一种状态,需要进行功能性浏览器测试以检查所有页面响应的返回状态代码,并且如果遇到503,请尝试在失败之前重新加载X次页面。
我曾尝试使用Playwright网络事件,但似乎改变Page状态(即触发重新加载)会中断以后的任何交互,最终会导致Execution context was destroyed,most likely because of a navigation.
错误。
例如:
page.on('response',async (response) => {
if (response.request().resourceType() !== 'document') return;
if (response.status() === 503) {
await page.reload();
}
}
(为了简洁起见,我省略了重试尝试逻辑)
执行此代码后,任何与页面互动的尝试都将导致Execution context was destroyed
错误。
解决方法
这是一个有趣的场景。如果BrowserContext处有response
,则您的方法可行。既然不是这种情况,则需要通过打开新页面来完成“重新加载”。
这可以通过“重试后返回页面”的助手方法来实现。此方法将重试页面创建和导航以查找错误状态代码。
const {chromium} = require('playwright');
const pageAfterRetries = async (context,url,maxRetries) => {
if (!maxRetries) return;
const page = await context.newPage();
const [_,response] = await Promise.all([
page.goto(url),page.waitForEvent('response',response => response.request().resourceType() === 'document')
]);
if (response.status() === 503) {
// Retry if this happens
await page.close();
return pageAfterRetries(context,maxRetries - 1);
}
return page;
}
(async() => {
const browser = await chromium.launch({headless: false});
const context = await browser.newContext();
const page = await pageAfterRetries(context,'https://www.google.com',3);
// Use page for remaining script
console.log(page);
})();