Retry QA server navigation

This commit is contained in:
2026-07-07 06:55:35 +09:00
parent 2e403db6e0
commit af1ee8dce1

View File

@@ -1273,7 +1273,7 @@ try {
}
async function setupBattle(page, battle) {
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
await gotoTargetPage(page);
await page.waitForFunction(() => window.__HEROS_GAME__ !== undefined && window.__HEROS_DEBUG__ !== undefined, undefined, { timeout: 90000 });
await page.evaluate((selected) => {
const now = new Date().toISOString();
@@ -1321,7 +1321,7 @@ async function setupCumulativeBattle(page, battle, firstBattle) {
firstBattle && resumeCampaignSnapshot && campaignSnapshotPath && existsSync(campaignSnapshotPath)
? await readFile(campaignSnapshotPath, 'utf8')
: undefined;
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
await gotoTargetPage(page);
await page.waitForFunction(() => window.__HEROS_GAME__ !== undefined && window.__HEROS_DEBUG__ !== undefined, undefined, { timeout: 90000 });
const preparation = await page.evaluate(
({ firstBattle, initialSnapshot, labels, protectedUnitIds, selected, slotKey, storageKey }) => {
@@ -1454,6 +1454,38 @@ async function setupCumulativeBattle(page, battle, firstBattle) {
return preparation;
}
async function gotoTargetPage(page) {
let lastError;
for (let attempt = 0; attempt < 3; attempt += 1) {
try {
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
return;
} catch (error) {
lastError = error;
if (!isServerConnectionError(error) || attempt === 2) {
throw error;
}
console.log(`QA server connection failed at ${targetUrl}; restarting local server and retrying (${attempt + 1}/2).`);
await restartLocalServer();
}
}
throw lastError;
}
async function restartLocalServer() {
if (serverProcess) {
serverProcess.kill();
serverProcess = undefined;
await sleep(1000);
}
serverProcess = await ensureLocalServer(targetUrl);
}
function isServerConnectionError(error) {
const message = String(error?.message ?? error);
return message.includes('ERR_CONNECTION_REFUSED') || message.includes('ECONNREFUSED') || message.includes('ERR_CONNECTION_RESET');
}
async function normalizeRepresentativeBattleUnits(page, battle) {
await page.evaluate(
({ no, selected, protectedUnitIds }) => {