Chrome DevTools Protocol: วิธียกเลิกการสมัคร Page.javascriptDialogOpening เหตุการณ์

Sep 08 2020

ฉันใช้ฟังก์ชัน Chrome DevTools Protocol 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 ที่เป็นไปได้ Page.javascriptDialogOpeningเพิ่มผู้ฟัง11 คน ใช้ 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});
    });