Chrome DevTools协议:如何退订Page.javascriptDialogOpening事件

问题描述

我正在使用Chrome DevTools协议API函数来监听javascriptDialogopening事件。下面是代码

async navigate(url: URL,target: any) {

  const { Page } = target.connection;

  // Enable the required protocol features
  await Page.enable();

  // Add a listener and handler for JavaScript dialogs
  Page.javascriptDialogopening(async(event: Protocol.Page.JavascriptDialogopeningEvent) => {

  // Respond with a confirmation to all dialogs
  const dialogResponse: Protocol.Page.HandleJavaScriptDialogRequest = {
      'accept': true
    };

  Page.handleJavaScriptDialog(dialogResponse);
  });
}

我收到一个错误:MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个Page.javascriptDialogopening侦听器。使用generator.setMaxListeners()增加限制

解决方法

通过将javascriptDialogOpening事件注册放入navigate处理程序中,您可以一次又一次添加处理程序。因为每次导航事件发生,您都要重新添加此事件处理程序。

您这里真正想要的是将javascriptDialogOpening事件注册放入初始化代码中。如果这样做,它将仅注册一次,并且不再有此问题。

CDP({'host': host,'port': port},(client) => {
// ...
    Page.javascriptDialogOpening((params) => {
      Page.handleJavaScriptDialog({'accept': true});
    });