fix(page): waitPageReady 超时降级 + reload 重试;openNewPage 空白页兜底

- waitPageReady: domcontentloaded 超时后降级等 load,仍超时则 reload 重试
- openNewPage: 页面为 about:blank 时自动 reload 兜底
- 超时时间从 30s 缩短至 15s,减少无谓等待

Co-Authored-By: AtomCode (deepseek-v4-flash) <noreply@atomgit.com>
This commit is contained in:
zycha
2026-07-10 14:49:33 +08:00
parent 2ab0fbde9e
commit 967b842e15

View File

@@ -220,12 +220,25 @@ async function openNewPage(context, clickAction, options = {}) {
logger.info(' → 新页面已打开,等待页面加载...'); logger.info(' → 新页面已打开,等待页面加载...');
// 等待新页面完全加载 // 等待新页面加载完成(内部含超时降级 + 刷新重试)
await waitPageReady(newPage); await waitPageReady(newPage);
const info = await getPageInfo(newPage); const info = await getPageInfo(newPage);
logger.info(` → 新页面: title="${info.title}", url=${info.url}`); 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; return newPage;
} }
@@ -280,15 +293,42 @@ async function openLinkPage(context, locator, options = {}) {
* @param {number} [options.timeout=30000] * @param {number} [options.timeout=30000]
*/ */
async function waitPageReady(page, options = {}) { async function waitPageReady(page, options = {}) {
const timeout = options.timeout || 30000; const timeout = options.timeout || 15000;
const maxRetries = options.maxRetries || 1;
logger.info(' → waitPageReady: 等待 domcontentloaded...'); for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
// 第1步等待 domcontentloaded
logger.info(` → waitPageReady: 等待 domcontentloaded (尝试 ${attempt}/${maxRetries + 1})...`);
try { try {
await page.waitForLoadState('domcontentloaded', { timeout }); await page.waitForLoadState('domcontentloaded', { timeout });
logger.info(' → waitPageReady: domcontentloaded 完成'); logger.info(' → waitPageReady: domcontentloaded 完成');
return;
} catch (err) { } catch (err) {
logger.warn(` → waitPageReady: domcontentloaded 超时 (${err.message})`); 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: 所有尝试均超时,继续执行');
} }
/** /**