首页 > 解决方案 > Puppeteer 流逻辑,检查是否发生导航(vs 等待)

问题描述

寻找一些反馈。在 Puppeteer 中,我想检查是否发生了导航,如果有则做某事,如果没有则做其他事情(例如再试一次)。我想出的两种方法是:

if (await page.url() != finalURL) {
    let t = 0;  
    busy: while(t > 400) {
        try {
            await Promise.all([
                await page.click('#tryAgainLink'),
                await page.waitForNavigation(),
            ]);
            break busy;
        } catch(err) {
            // navigation didn't happen
            t++;
            await page.waitForTimeout(1500);
        }
    }
}

但是我的理解是尝试/捕获流逻辑并不理想。我的替代方案是这样的:

let t = 0;
busy: while(await page.url() != finalURL) {
    await page.click('#tryAgainLink');
    await page.waitForTimeout(1500);
    t++;
    if(t > 400) {
        break busy;
    }
}

我想知道我是否应该waitForNavigatin在那里有一个,但如果没有的话,我必须再次捕获抛出的错误。我的意思是对此进行测试,但我不确定await page.url()while 循环是否会在导航发生时触发几次,和/或这是否会破坏页面上下文。

有没有比上述两种方法更好的方法?第一个确实有效,我很想保持原样。谢谢你。

标签: javascriptpuppeteer

解决方案


您应该能够执行以下操作:

await page.waitForFunction((finalUrl) => {
  return document.location === finalUrl
}, {}, finalUrl).catch(retry)

但它可能更简单:

await page.waitForResponse(finalUrl).catch(retry)

推荐阅读