Protocolo Chrome DevTools: cómo cancelar la suscripción del evento Page.javascriptDialogOpening

Sep 08 2020

Estoy usando las funciones de la API del protocolo Chrome DevTools para escuchar el javascriptDialogOpeningevento. A continuación se muestra el código.

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

Recibí un error: MaxListenersExceededWarning: Posible fuga de memoria EventEmitter detectada. Se Page.javascriptDialogOpeningagregaron 11 oyentes. Utilice emitter.setMaxListeners () para aumentar el límite

Respuestas

1 NicholasDiPiazza Sep 10 2020 at 13:35

Al colocar el javascriptDialogOpeningregistro de eventos en el navigatecontrolador, está agregando el controlador una y otra vez. Porque cada vez que ocurre un evento de navegación, vuelve a agregar este controlador de eventos.

Lo que realmente desea aquí es poner el javascriptDialogOpeningregistro del evento en su código de inicialización. Si hace esto, se registrará solo una vez y ya no tendrá este problema.

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