指定Chrome路径启动Puppeteer报Page.getFrameTree未找到错误及相关问题
问题分析与解决方案
1. Protocol error (Page.getFrameTree) 错误原因及解决
你遇到的这个协议错误,核心原因是Puppeteer版本与指定的Chrome版本不兼容。Puppeteer每个版本都绑定了特定的Chrome/Chromium版本,你使用的Puppeteer v0.13.0对应的是Chrome 64.x系列,但你指定的本地Chrome是63.0.3239.84——两者的Chrome DevTools Protocol(CDP)不匹配,Page.getFrameTree是较新版本CDP才引入的方法,旧版Chrome 63不支持,所以抛出了这个错误。
解决办法有三个可选方向:
- 保留默认配置:就是你已经发现有效的方式——移除
executablePath,让Puppeteer使用自带的兼容版本Chrome/Chromium,这样CDP协议能完美匹配,不会再出现错误。 - 升级本地Chrome:把你的Chrome升级到64.x或更高版本(可以查看Puppeteer v0.13.0的发布说明确认具体适配版本),之后再指定
executablePath就能正常运行。 - 降级Puppeteer:找到适配Chrome 63的Puppeteer版本(比如v0.12.x系列),通过
npm install puppeteer@0.12.x安装即可。
2. --disable-infobars 参数不生效的问题
在Chrome 63及之后的版本中,--disable-infobars的行为有所调整,再加上Puppeteer默认会添加一些启动参数,可能会干扰这个参数的生效。你可以试试这两种方案:
- 调整启动参数并排除冲突项:在
launch选项里,移除默认的自动化提示参数,确保--disable-infobars能正常生效:const browser = await puppeteer.launch({ headless: false, args: ['--disable-infobars', '--remote-debugging-port=9222'], ignoreDefaultArgs: ['--enable-automation'] // 移除默认的自动化提示参数,避免冲突 }); - 页面加载后通过JS手动隐藏:如果参数方式无效,可以在页面加载完成后执行一段脚本强制隐藏信息栏:
await gitPage.evaluate(() => { const infobar = document.querySelector('.infobar'); if (infobar) infobar.style.display = 'none'; });
3. 视口设置不生效的问题
你在puppeteer.launch()里写的setViewport: {width: 1920, height: 1080}是错误配置——launch方法的选项里根本没有setViewport这个参数!视口设置只能通过page.setViewport()方法实现,也就是你在browser.newPage()之后调用的gitPage.setViewport({width: 1024, height: 768})。
只要解决了前面的协议错误,这段视口设置代码就能正常生效。记得把launch里无效的setViewport配置删掉,避免混淆。
修正后的完整代码
const puppeteer = require("puppeteer"); (async() => { const browser = await puppeteer.launch({ headless: false, args: ['--disable-infobars', '--remote-debugging-port=9222'], // 若坚持使用本地Chrome,请确保版本与Puppeteer兼容 // executablePath: "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", ignoreDefaultArgs: ['--enable-automation'] }); try{ const gitPage = await browser.newPage(); await gitPage.setViewport({width: 1024, height: 768}); await gitPage.goto("https://github.com/login", {waitUntil: 'networkidle2'}); await gitPage.type("#login_field", "CaptainPlanet", {delay: 100}); await gitPage.type("#password", "NPH_Andrews", {delay: 100}); const btnLogin = await gitPage.$("input[tabindex='3']"); await btnLogin.click(); }catch(err) { console.log("error: " + err.message); } })();
内容的提问来源于stack exchange,提问作者JoeyG2677
相关产品推荐
相关产品推荐

