Protokół Chrome DevTools: jak anulować subskrypcję zdarzenia Page.javascriptDialogOpening
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
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});
});