使用puppeteer-extra时无法正确获取TimeoutError的问题求助
之前我解决了原生Puppeteer代码里TimeoutError未定义的问题,但换成puppeteer-extra(搭配stealth插件)之后,又卡在了获取TimeoutError这一步。运行测试代码时总是报错TypeError: Right-hand side of 'instanceof' is not an object,实在搞不懂哪里出问题了,麻烦大家帮我看看!
先给大家看我用来复现问题的最小可运行代码(SSCCE):
const puppeteer = require("puppeteer-extra"); let browser; (async () => { const stealthPlugin = require('puppeteer-extra-plugin-stealth'); puppeteer.use(stealthPlugin()); browser = await puppeteer.launch(); const [page] = await browser.pages(); try { await page.goto("https://www.example.com", {timeout: 1}); // 设极短超时强制触发错误 } catch (err) { if (err instanceof puppeteer.TimeoutError) { console.log("caught timeout error", err); } else { console.log("caught non-timeout error", err); } } })() .catch(err => console.log(err)) .finally(() => browser?.close());
(注:这里用console.log()而非console.error()是因为我的客户端代码拿不到错误流里的内容)
相关环境信息
一开始我只知道项目里Puppeteer的版本是23.7.1,不知道puppeteer-extra的版本,后来查了下各个相关组件的版本:
- puppeteer-extra: 3.3.6
- puppeteer-extra-plugin: 3.2.3
- puppeteer-extra-plugin-stealth: 2.11.2
- puppeteer-extra-plugin-user-data-dir: 2.4.1
- puppeteer-extra-plugin-user-preferences: 2.4.1
项目根目录的package.json内容如下(遗憾的是里面没提到puppeteer-extra,应该是直接安装但没记录到依赖里):
{ "name": "puppeteer-project", "version": "1.0.0", "description": "Puppeteer Project", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "puppeteer": "^23.7.1" } }
我尝试过的修改(但还是没解决)
看了相关建议后,我试着同时引入原生Puppeteer和puppeteer-extra,想用原生的TimeoutError来做判断,代码改成了这样:
const pupbasic = require("puppeteer"); // ^23.7.1 const puppeteer = require("puppeteer-extra"); // ^3.3.6 const stealthPlugin = require("puppeteer-extra-plugin-stealth"); // ^2.11.2 puppeteer.use(stealthPlugin()); let browser; (async () => { browser = await puppeteer.launch(); const [page] = await browser.pages(); try { await page.goto("https://www.example.com", {timeout: 1}); } catch (err) { if (err instanceof pupbasic.errors.TimeoutError) { console.log("caught timeout error", err); } else { console.log("caught non-timeout error", err); } } })() .catch(err => console.log(err)) .finally(() => browser?.close());
结果又报了新错误:TypeError: Cannot read properties of undefined (reading 'TimeoutError')
另外我发现本地好像装了两个版本的Puppeteer:项目目录下的package.json写的是23.7.1,但用户目录下node_modules/puppeteer里的版本是23.9.0,会不会是版本冲突导致的?
我JS经验不多,也找不到相关源码去排查,实在是摸不着头脑了,有没有大佬能指点一下?万分感谢!
内容来源于stack exchange

