如何触发Puppeteer的.on事件?关闭浏览器未处理会报错
解决Puppeteer中获取授权码后移除response事件监听器的问题
你遇到的核心问题是匿名事件监听器无法通过page.off移除,因为page.off需要引用绑定的具体函数。另外直接关闭浏览器可能因未处理完的异步事件报错,正确的做法是先移除监听器再关闭浏览器。
解决方案步骤:
- 将原来的匿名回调函数抽成具名函数,让
page.off能精准找到要移除的监听器 - 在获取到
authorizationCode后,调用page.off('response', 函数名)移除监听器 - 确保监听器移除后再执行
browser.close(),避免异步操作冲突导致报错
修改后的代码示例:
// 定义具名的响应处理函数 async function handleResponse(resp) { if (resp.url().includes("navigator.successRedirect")) { let code = await page.$eval("pre", el => el.textContent); code = JSON.parse(code).authorizationCode; console.log(code); // 移除当前绑定的response事件监听器 page.off("response", handleResponse); // 监听器移除完成后再关闭浏览器 await browser.close(); } } // 绑定事件监听器 page.on("response", handleResponse);
关键说明:
- 原来的
page.off('response', this)无效,因为this在匿名函数中的指向不是当前回调函数,且匿名函数无法被page.off定位到 - 把回调抽成具名函数后,
page.on和page.off使用同一个函数引用,就能正确移除监听器 - 先移除监听器再关闭浏览器,能避免浏览器关闭时还有未完成的响应监听异步操作,从而消除报错
内容的提问来源于stack exchange,提问作者Mirikkingg
相关产品推荐
相关产品推荐

