programing

puppeteer: 다음 줄로 계속하기 전에 N초 대기

lastmoon 2023. 8. 10. 19:08
반응형

puppeteer: 다음 줄로 계속하기 전에 N초 대기

puppeteer에서는 다음 코드 행으로 이동하기 전에 정의된 시간을 기다립니다.

나는 그것을 넣으려고 노력했습니다.setTimeout평가 기능에서 그러나 단순히 무시되는 것처럼 보입니다.

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

이 코드는 기다리지 않고 대기 전과 대기 후에 쓰기만 합니다.

너는 이것을 어떻게 하는지 아니?

약간의 약속 기능을 사용할 수 있습니다.

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

하지만 처음 두 가지 예를 간단히 사용할 수 있을 것 같습니다.

다음을 사용해 왔습니다.

await page.waitForTimeout(3000);

여기서 3000은 밀리초이고, 그것은 나에게 효과가 있는 것처럼 보입니다.

다음 옵션 중 하나를 사용하여 1초 동안 기다릴 수 있습니다.

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

page.waitFor는 이제 더 이상 사용되지 않습니다.

page.waitForTimeout은 다음 작업을 계속하기 전에 지정된 밀리초 동안 스크립트 실행을 일시 중지하는 것이 좋습니다.

await page.waitForTimeout(1000)

다른 대답들은 잠자는 법을 보여주었지만, 지금은.page.waitForTimeout마침내 더 이상 사용되지 않습니다. 한동안 추가하고 싶었던 답변을 추가하겠습니다.

잠을 자지 마!그것은 Puppeteer의 이벤트 주도 특성을 방해하는 레이스 상태를 유발하여 불필요한 취약성을 초래합니다.거의 항상 더 나은 술어가 기다리고 있습니다.

  • CSS 선택기, 아리아 레이블, 텍스트 또는 XPath가 나타나기를 기다리시겠습니까? 시도해 보십시오.waitForSelector(선택적으로 적절한 내장 셀렉터와 함께).
  • 내비게이션을 기다리시겠습니까? 시도해 보십시오.waitForNavigation또는 조정합니다.waitUntil에 대한 옵션.goto.
  • 네트워크 이벤트 또는 상태를 기다리시겠습니까? 시도하십시오.waitForRequest,waitForResponse또는waitForNetworkIdle.
  • 팝업을 기다리고 있습니까?약속을 해보세요.
  • 최소 자식 요소 수와 같은 임의의 술어가 나타나기를 기다리시겠습니까? 시도해 보십시오.waitForFunction.
  • 탐지를 피하려고 합니까? 시도해 보십시오.slowMo.
  • 다른 거?실행 anevaluateDOM 변환 또는 폴링을 대기하기 위해 차단하고 자신의 코드를 추가합니다.setInterval또는requestAnimationFrame효율적으로 재구현waitForFunction당신의 필요에 따라.

waitForFunction특히 잘 사용되지 않지만 그것은 엄청난 양의 신뢰성과 정밀성을 추가합니다.waitForTimeout안 합니다.

다른 모든 것이 실패하고 스크립트를 차단해야 한다면 지연시킬 수 있습니다. 하지만 저는 수백 개의 Puppeteer 스크립트를 작성했고 수면 변형을 사용한 적이 없기 때문에 기본적으로 불필요하다고 확신합니다.

절대적인 최후의 수단을 제외하고는 어떤 형태로든 잠을 피해야 하는 이유에 대한 자세한 분석은 Puppeteer AntiPatterns에 있는 내 블로그 게시물을 참조하십시오.

위의 한 가지 주의 사항: sleep은 스크립트를 개발하는 동안 임시 디버깅에 유용할 수 있습니다.

이 기능을 사용해 보십시오.

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

그것을 사용하기 위해

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

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

구문이 불완전합니다.
해보세요...

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

언급URL : https://stackoverflow.com/questions/46919013/puppeteer-wait-n-seconds-before-continuing-to-the-next-line

반응형