diff --git a/utils/page.js b/utils/page.js index a7a67e3..96d19a7 100644 --- a/utils/page.js +++ b/utils/page.js @@ -220,12 +220,25 @@ async function openNewPage(context, clickAction, options = {}) { logger.info(' → 新页面已打开,等待页面加载...'); - // 等待新页面完全加载 + // 等待新页面加载完成(内部含超时降级 + 刷新重试) await waitPageReady(newPage); const info = await getPageInfo(newPage); logger.info(` → 新页面: title="${info.title}", url=${info.url}`); + // 兜底:如果页面还卡在 about:blank,尝试 reload + if (info.url === 'about:blank' || !info.url) { + logger.warn(' → 页面为空白页,尝试刷新...'); + try { + await newPage.reload({ timeout: 30000 }); + await waitPageReady(newPage); + const retryInfo = await getPageInfo(newPage); + logger.info(` → 刷新后: title="${retryInfo.title}", url=${retryInfo.url}`); + } catch (reloadErr) { + logger.warn(` → 刷新失败: ${reloadErr.message}`); + } + } + return newPage; } @@ -280,15 +293,42 @@ async function openLinkPage(context, locator, options = {}) { * @param {number} [options.timeout=30000] */ async function waitPageReady(page, options = {}) { - const timeout = options.timeout || 30000; + const timeout = options.timeout || 15000; + const maxRetries = options.maxRetries || 1; - logger.info(' → waitPageReady: 等待 domcontentloaded...'); - try { - await page.waitForLoadState('domcontentloaded', { timeout }); - logger.info(' → waitPageReady: domcontentloaded 完成'); - } catch (err) { - logger.warn(` → waitPageReady: domcontentloaded 超时 (${err.message})`); + for (let attempt = 1; attempt <= maxRetries + 1; attempt++) { + // 第1步:等待 domcontentloaded + logger.info(` → waitPageReady: 等待 domcontentloaded (尝试 ${attempt}/${maxRetries + 1})...`); + try { + await page.waitForLoadState('domcontentloaded', { timeout }); + logger.info(' → waitPageReady: domcontentloaded 完成'); + return; + } catch (err) { + logger.warn(` → waitPageReady: domcontentloaded 超时`); + } + + // 第2步:等待 load(兜底) + logger.info(' → waitPageReady: 等待 load...'); + try { + await page.waitForLoadState('load', { timeout }); + logger.info(' → waitPageReady: load 完成'); + return; + } catch (err) { + logger.warn(' → waitPageReady: load 超时'); + } + + // 还没到重试上限 → reload 重试 + if (attempt <= maxRetries) { + logger.info(' → waitPageReady: 刷新页面重试...'); + try { + await page.reload({ timeout: 30000 }); + } catch (reloadErr) { + logger.warn(` → waitPageReady: 刷新失败 (${reloadErr.message}),继续重试`); + } + } } + + logger.warn(' → waitPageReady: 所有尝试均超时,继续执行'); } /**