解决 puppeteer 对特定事件的承诺

Him*_*mad 3 javascript ajax node.js puppeteer

特定事件发生后,如何继续使用我的 puppeteer 代码?以一种同步的方式。例如,我有以下“请求”事件代码:

await page.on('request', request => {
  if (request.resourceType() === 'xhr'){
    //do something
  }
});
Run Code Online (Sandbox Code Playgroud)

我的 puppeteer 代码依赖于特定页面上的 AJAX 调用响应来填写表单。因此,我想我必须以某种方式创建请求事件函数,以便在满足条件时解析承诺,以便在代码中稍后将其用作参考,但我希望获得有关该主题的一些指导,因为我不太熟悉使用异步代码,也不使用 Promise 或 puppeteer。谢谢!

Eve*_*tss 5

page.on('request')你可以在进入页面之前封装 Promise 并等待这个 Promise 被解析,如下所示:

const observedXhr = new Promise(resolve =>
  page.on('request', request => {
    if (request.resourceType() === "xhr") {
      resolve();
    }
    request.continue();
  })
);

// later in the code

await observedXhr;

// rest of the program after xhr is compleated
Run Code Online (Sandbox Code Playgroud)

这是完整的示例:

const puppeteer = require('puppeteer');

const html = `
<html>
  <body>
    <script>
      fetch('https://swapi.co/api/people/1/');
    </script>
  </body>
</html>`;

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setRequestInterception(true);

  const observedXhr = new Promise(resolve =>
    page.on('request', request => {
      if (request.resourceType() === "xhr") {
        resolve();
      }
      request.continue();
    })
  );

  await page.goto(`data:text/html,${html}`);

  console.log('before xhr');

  // await for resolved promise
  await observedXhr;

  console.log('after xhr');
  await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)

这个问题扩展了你的问题——它对你来说很有价值。