javascript - Playwright ladda om sidan efter navigering om viss statuskod
Jag är i en situation där jag behöver att mina funktionella webbläsartester kontrollerar returstatuskoden för alla svarsidor, och om jag får en 503, försöka ladda om sidan X antal gånger innan det misslyckas.
Jag har försökt använda Playwright-nätverkshändelser, men det verkar som att ändring av Sidans tillstånd (dvs. att trigga en omladdning) bryter alla framtida interaktioner och du slutar med Execution context was destroyed, most likely because of a navigation.-fel.
Till exempel:
page.on('response', async (response) => {
if (response.request().resourceType() !== 'document') return;
if (response.status() === 503) {
await page.reload();
}
}
(Jag har utelämnat logiken för omförsöksförsök för enkelhetens skull)
Efter att denna kod har körts kommer alla försök att interagera med sidan att resultera i felet Execution context was destroyed.
Jag är inte 100% säker på att det här är rätt sätt att närma sig det här problemet. Några idéer?
Svar #1
För mig behövdes bara den här delen när jag sökte efter hur man laddar om sidan med Playwright:
await page.reload();
Svar #2
Detta är ett intressant scenario. Om response var tillgänglig på BrowserContext, skulle din metod fungera. Eftersom det inte är fallet, behöver "reload" göras genom att öppna en ny sida.
Detta kan uppnås med en hjälpfunktion som "returnerar sidan efter försök". Denna metod skulle försöka skapa sidan och navigera på nytt vid felstatuskod.
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);
})();
