Chrome DevToolsプロトコル:Page.javascriptDialogOpeningイベントの登録を解除する方法

Sep 08 2020

Chrome DevTools ProtocolAPI関数を使用して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のメモリリークが検出された可能性があります。11Page.javascriptDialogOpening人のリスナーが追加されました。制限を増やすには、emitter.setMaxListeners()を使用します

回答

1 NicholasDiPiazza Sep 10 2020 at 13:35

javascriptDialogOpeningイベント登録をnavigateハンドラーに入れることで、ハンドラーを何度も追加することになります。ナビゲーションイベントが発生するたびに、このイベントハンドラーを再度追加しているためです。

ここで本当に必要なのjavascriptDialogOpeningは、初期化コードにイベント登録を入れることです。これを行うと、一度だけ登録され、この問題は発生しなくなります。

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