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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...