javascript - Puppeteer 流程​​逻辑,检查导航是否发生(与等待)

标签 javascript puppeteer

寻找一些反馈。在 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);
        }
    }
}

但是我的理解是,对于流逻辑,try/catch 并不理想。我的替代方案是这样的:

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

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

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

最佳答案

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

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

但它可能更简单:

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

关于javascript - Puppeteer 流程​​逻辑,检查导航是否发生(与等待),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64342023/

相关文章:

javascript - iframe.onload 的替代品?

puppeteer - 在 puppeteer 中如何等待弹出页面完成加载?

javascript - 页面评估的返回值( puppeteer 操纵者,异步编程)

javascript - 在 google puppeteer 上作为 evaluate 方法的参数

javascript - 我无法使用 javascript 和 Puppeteer 获取 <span> 标记中包含的数字值

javascript - 在 puppeteer 中“找不到给定 ID 的框架”

javascript - 哪些浏览器支持 bind()?

javascript - 依赖可观察对象中的大型数组 - 级联

javascript - IE10 上的 WebSocket 给出安全错误

javascript - 如何将我的 JavaScript 代码转换为小书签?