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