Protokół Chrome DevTools: jak anulować subskrypcję zdarzenia Page.javascriptDialogOpening

Sep 08 2020

Do nasłuchiwania javascriptDialogOpeningzdarzenia używam funkcji interfejsu API protokołu Chrome DevTools . Poniżej znajduje się kod.

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

Wystąpił błąd: MaxListenersExceededWarning: Wykryto możliwy wyciek pamięci EventEmitter. Page.javascriptDialogOpeningDodano 11 słuchaczy. Użyj emitter.setMaxListeners (), aby zwiększyć limit

Odpowiedzi

1 NicholasDiPiazza Sep 10 2020 at 13:35

Umieszczając javascriptDialogOpeningrejestrację zdarzeń w navigatemodule obsługi, dodajesz procedurę obsługi w kółko. Ponieważ za każdym razem, gdy ma miejsce zdarzenie nawigacji, ponownie dodajesz tę procedurę obsługi zdarzenia.

To, czego naprawdę chcesz, to umieszczenie javascriptDialogOpeningrejestracji wydarzenia w kodzie inicjalizacyjnym. Jeśli to zrobisz, zostanie on zarejestrowany tylko raz i nie będziesz już mieć tego problemu.

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