Javascript 木偶演员流程逻辑,检查导航是否发生(vs等待)

Javascript 木偶演员流程逻辑,检查导航是否发生(vs等待),javascript,puppeteer,Javascript,Puppeteer,寻找一些反馈。在《木偶戏》中,我想检查导航是否发生,如果发生了,就做一些事情,如果没有发生,就做一些其他事情(例如,再试一次)。我想出的两种方法是: if (await page.url() != finalURL) { let t = 0; busy: while(t > 400) { try { await Promise.all([ await page.click('#tryAgainLin

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

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;
    }
}
我想知道我是否应该在那里有一个
waitfornavigatein
,但是如果没有的话,我必须再次捕获抛出的错误。我想测试一下,但我不确定while循环的
wait page.url()
是否会在导航发生时触发几次,和/或这是否会破坏页面上下文


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

也许是这样的:

let t = 0;
busy: while(await page.url() != finalURL) {
    await page.click('#tryAgainLink');
    await page.waitForTimeout(1500);
    t++;
    if(t > 400) {
        break busy;
    }
}
if(page.url()!==finalURL){//wait在这里不需要
设t=0;
忙:虽然(t<400){//400'是打字错误吗?
const[\uu,navigation]=等待承诺([
页面。单击(“#tryAgainLink”),
page.waitForNavigation(),
]);
如果(navigation.status===“已完成”)中断忙碌;
t++;
等待页面。等待时间(1500);
}
}

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

await page.waitForFunction((finalUrl) => {
  return document.location === finalUrl
}, {}, finalUrl).catch(retry)
但可能更简单的做法是:

await page.waitForResponse(finalUrl).catch(retry)
我使用这种方法:


异步函数isNavigation(){
试一试{
等待page.evaluate(()=>console.log('any code'))
返回错误
}捕获(ex){
//检查错误,应为:
//执行上下文被破坏,很可能是因为导航
返回真值
}
}

不确定您为什么有
承诺。在您的第一个示例中,所有的
。内部
wait
s让它变得毫无意义。@Ourobrus内部
wait
应该省略,习惯的力量来自于反复输入
wait页面。*
。它们都在
承诺中的原因。所有的
都来自木偶师文档:“如果
单击()
触发导航事件,并且有一个单独的
页面。waitForNavigation()
承诺要解决,你可能会得到一个产生意外结果的竞赛条件。”相关问题: