导航后,如果某些状态代码,

问题描述

我处于一种状态,需要进行功能性浏览器测试以检查所有页面响应的返回状态代码,并且如果遇到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错误

我不是100%肯定这是解决此问题的正确方法。有什么想法吗?

解决方法

这是一个有趣的场景。如果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);
})();