2

我的情况是,我需要我的功能浏览器测试来检查所有页面响应的返回状态代码,如果我收到 503,请尝试在失败前重新加载页面 X 次。

我曾尝试使用 Playwright 网络事件,但似乎更改页面状态(即触发重新加载)会破坏任何未来的交互,并且最终会出现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% 确定这是解决这个问题的正确方法。有任何想法吗?

4

1 回答 1

4

这是一个有趣的场景。如果responseBrowserContext可用,您的方法将有效。由于情况并非如此,因此需要通过打开新页面来完成“重新加载”。

这可以通过“重试后返回页面”的辅助方法来实现。此方法将重试页面创建和导航以获取错误状态代码。

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, url, 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);
})();
于 2020-08-21T17:15:16.327 回答