Giao thức Chrome DevTools: Cách hủy đăng ký sự kiện Page.javascriptDialogOpening

Sep 08 2020

Tôi đang sử dụng các hàm API giao thức Chrome DevTools để lắng nghe javascriptDialogOpeningsự kiện. Dưới đây là mã.

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

Tôi gặp lỗi: MaxLististsExceededWarning: Đã phát hiện rò rỉ bộ nhớ EventEmitter có thể xảy ra. 11 Page.javascriptDialogOpeningthính giả được thêm vào. Sử dụng emitter.setMaxListaries () để tăng giới hạn

Trả lời

1 NicholasDiPiazza Sep 10 2020 at 13:35

Bằng cách đưa javascriptDialogOpeningđăng ký sự kiện vào navigatetrình xử lý, bạn đang thêm trình xử lý nhiều lần. Bởi vì mỗi khi sự kiện điều hướng xảy ra, bạn đang thêm lại trình xử lý sự kiện này.

Những gì bạn thực sự muốn ở đây là đặt javascriptDialogOpeningđăng ký sự kiện vào mã khởi tạo của bạn. Nếu bạn làm điều này, nó sẽ được đăng ký một lần duy nhất và bạn sẽ không còn gặp vấn đề này nữa.

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