104

puppeteer中,我想在进入下一行代码之前等待一段定义的时间。

我试图将 asetTimeout放入评估函数中,但它似乎被简单地忽略了

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

此代码不要等待,只需在等待之前和等待之后编写

你知道怎么做吗?

4

7 回答 7

174

你可以使用一点承诺功能,

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)
    });
});

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

于 2017-10-26T23:24:26.153 回答
78

我一直在使用:

await page.waitForTimeout(3000);

3000 是毫秒,这似乎对我有用。

于 2019-02-25T16:33:23.720 回答
48

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

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});
于 2018-10-29T00:44:13.493 回答
22

page.waitFor现在已被弃用。

现在建议page.waitForTimeout在继续之前将脚本执行暂停给定的毫秒数:

await page.waitForTimeout(1000)
于 2020-09-30T20:39:43.593 回答
3

试试这个功能。

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

使用它

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

  demo();
于 2019-02-25T13:39:25.930 回答
0
await new Promise(_func=> setTimeout(_func, 5000));
于 2019-02-24T05:09:35.103 回答
-4

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

await page.evaluate(async() => {
    setTimeout(function(){
        console.log('waiting');
    }, 4000)
});
于 2017-10-24T20:00:42.440 回答