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:
@@ -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: 所有尝试均超时,继续执行');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user