javascript puppet 师:等N秒钟再继续下一行

wdebmtf2  于 2023-03-06  发布在  Java
关注(0)|答案(8)|浏览(108)

在 * puppeteer * 中,我希望在进入下一行代码之前等待一段定义的时间。
我试过在evaluate函数中放入一个setTimeout,但它似乎被忽略了

console.log('before waiting');
await page.evaluate(async() => {
  setTimeout(function(){
      console.log('waiting');
  }, 4000)
});
console.log('after waiting');

此代码不等待,只写 * before waiting * 和 * after waiting *
你知道怎么做吗?

0qx6xfy6

0qx6xfy61#

你可以使用一个承诺函数,

function delay(time) {
   return new Promise(function(resolve) { 
       setTimeout(resolve, time)
   });
}

那你想推迟的时候就打电话。

console.log('before waiting');
await delay(4000);
console.log('after waiting');

如果你必须使用puppeteer,使用内置的waitForTimeout函数。

await page.waitForTimeout(4000)

如果仍要使用page.evaluate,请在4秒钟后解析它。您没有解析任何内容。

await page.evaluate(async() => {
    await new Promise(function(resolve) { 
           setTimeout(resolve, 1000)
    });
});

但我想你可以简单地用前两个例子。

ryevplcw

ryevplcw2#

我一直在使用:

await page.waitForTimeout(3000);

这里3000是毫秒这似乎对我有用.

ws51t4hk

ws51t4hk3#

您可以使用以下选项之一来等待一秒钟

await page.waitFor(1000);
await frame.waitFor(1000);
await new Promise(r => setTimeout(r, 1000));

或者,有许多Puppeteer函数包含内置的delay选项,这对于在某些事件之间等待可能会很方便:

// Click Delay
// Time to wait between mousedown and mouseup in milliseconds. Defaults to 0.

await page.click('#example', {delay: 1000});
await frame.click('#example', {delay: 1000});
await elementHandle.click({delay: 1000});
await page.mouse.click(0, 0, {delay: 1000});

// Type Delay
// Time to wait between key presses in milliseconds. Defaults to 0.

await page.type('#example', 'Hello, world!', {delay: 1000});
await frame.type('#example', 'Hello, world!', {delay: 1000});
await elementHandle.type('Hello, world!', {delay: 1000});
await page.keyboard.type('Hello, world!', {delay: 1000});

// Press Delay
// Time to wait between keydown and keyup in milliseconds. Defaults to 0.

await elementHandle.press('Backspace', {delay: 1000});
await page.keyboard.press('Backspace', {delay: 1000});
hgncfbus

hgncfbus4#

page.waitFor现在已被弃用。
page.waitForTimeout现在建议暂停脚本执行给定的毫秒数,然后再继续:

await page.waitForTimeout(1000)
brtdzjyr

brtdzjyr5#

其他答案已经说明了如何睡觉,但是现在page.waitForTimeoutfinally deprecated,我想我应该添加我想添加一段时间的答案:
不要睡觉!它会导致争用条件,破坏Puppeteer的事件驱动特性,引入不必要的脆弱性。几乎总是有更好的 predicate 可以等待:

  • 是否等待选择器出现?请尝试waitForSelector
  • 是否等待XPath出现?请尝试waitForXPath
  • 您是否正在等待导航?请尝试waitForNavigation
  • 是否正在等待网络响应?请尝试waitForNetworkIdlewaitForResponse
  • 是否等待弹出窗口?请尝试承诺.on("dialog", ...
  • 您是否在等待某个任意的 predicate ,例如出现最小数量的子元素?尝试waitForFunction
  • 运行一个evaluate块并添加您自己的代码,等待setIntervalrequestAnimationFrame的DOM突变或轮询,并根据需要有效地重新实现waitForFunction

waitForFunction尤其未得到充分利用,但它增加了waitForTimeout所没有的大量可靠性和精度。
如果所有其他方法都失败了,你必须阻止脚本,你可以延迟,但我已经写了数百个 puppet 师脚本,从来没有使用过任何睡眠变体,所以我很确信这基本上是不必要的。
请参阅我关于Puppeteer Antipatterns的博客文章,以获得关于为什么应该避免以任何形式睡觉的更多分析,除非是绝对的最后手段。
对上述问题的一个警告是:休眠对于开发脚本时的临时调试非常有用。

rjzwgtxy

rjzwgtxy6#

试试这个功能。

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

使用它

async function demo() {
    console.log('Waiting...');
    await sleep(3000);
    console.log('ok');
  }

  demo();
dly7yett

dly7yett7#

await new Promise(_func=> setTimeout(_func, 5000));
ghhaqwfi

ghhaqwfi8#

您的语法不完整。
试试这个...

await page.evaluate(async() => {
    setTimeout(function(){
        console.log('waiting');
    }, 4000)
});

相关问题