Puppeteer 等待特定的控制台事件

Puppeteer wait for specific console event

我正在尝试实现一个等待特定控制台事件发送的功能。 例如。有几个 console.endTime 调用正在完成(用于性能调试),我想等到最后一个(由特定消息文本标识)完成。 我的代码可以正常工作,但问题是 page.on 每次调用 waitForEvent 函数时都会添加新的事件侦听器。我明白为什么会这样,但还没有找到避免这种情况的解决方案。

代码如下所示:

function waitForEndEvent() {
            return new Promise((res, rej) => {
                registerConsoleEvent(page, res, rej);
            });
        }

function filterMessage() {
        return (msg) => {
            try {
                if (msg.type() == 'timeEnd') {
                    if (msg.text().includes("final time")) {
                        console.log('timeEnd:', msg.text());
                        res();
                    }
                }

            } catch (e) {
                rej(e);
            }
        };
    }
 
function registerConsoleEvent(page, res, rej) {
    page.on('console', filterMessage(res,rej));
}

有什么提示可以解决这个问题吗?

您可以在收到消息后移除事件监听器。您可以使用 page.removeListener(...) 方法删除事件侦听器。所以代码会像这样

function waitForEndEvent() {
  return new Promise((res, rej) => {
    registerConsoleEvent(page, res, rej);
  });
}

function registerConsoleEvent(page, res, rej) {
  page.on('console', function consoleListener(msg) {
    try {
      if (msg.type() == 'timeEnd') {
        if (msg.text().includes('final time')) {
          console.log('timeEnd:', msg.text());
          page.removeListener('console', consoleListener);
          res();
        }
      }
    } catch (e) {
      rej(e);
    }
  });
}