无法在本地找到预期的浏览器 chrome
Posted
技术标签:
【中文标题】无法在本地找到预期的浏览器 chrome【英文标题】:Could not find expected browser chrome locally 【发布时间】:2021-09-04 03:56:53 【问题描述】:此 Meteor 代码使用“puppeteer 8.0.0”、“puppeteer-core 10.0.0”、“puppeteer-extra 3.1.18”和“puppeteer-extra-plugin-stealth 2.7.8”,它给出了这个错误:
错误:无法在本地找到预期的浏览器 (chrome)。运行
npm install
以下载正确的 Chromium 修订版 (884014)。
尝试“npm install”无济于事。在线阅读,尝试从 package.json 依赖项中删除 "puppeteer-core": "^10.0.0" 无济于事。
非常感谢任何帮助。谢谢
const puppeteer = require('puppeteer-extra');
const nameH = require('./NameH');
const puppeteerOptions =
headless: true,
ignoreHTTPSErrors: true,
args: ['--no-sandbox', '--single-process', '--no-zygote', '--disable-setuid-sandbox']
let browser;
let pageNameH;
const init = async () =>
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
console.log('1') //>>>>>>>>>>>> Prints 1
puppeteer.use(StealthPlugin());
console.log('2') //>>>>>>>>>>>> Prints 2
browser = await puppeteer.launch(puppeteerOptions);
console.log('3') //>>>>>>>>> DID NOT PRINT <<<<<<<<<<<<<<<
pageNameH = await browser.newPage();
console.log('4')
await pageNameH.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
await pageNameH.setViewport( width: 1366, height: 768 );
await pageNameH.setRequestInterception(true);
blockResources(pageNameH);
const blockResources = page =>
page.on('request', (req) =>
if (req.resourceType() == 'stylesheet' || req.resourceType() == 'font' || req.resourceType() == 'image')
req.abort();
else
req.continue();
);
export const abc = async (nm, loc) =>
try
console.log('name try') //>>>>>>>>>>>> Prints "name try"
if (!(browser && pageNameH))
await init();
//use "required" nameh here
catch (error) // print the error <<<<<<<<<<<<<<<<<<<<<<<<<
console.log("Could not launch Puppeteer or open a new page.\n" + error);
if (browser && browser.close === 'function') await browser.close();
// included in package.json
"dependencies":
"@babel/runtime": "^7.11.2",
"axios": "^0.21.1",
"check": "^1.0.0",
"cheerio": "^1.0.0-rc.6",
"jquery": "^3.5.1",
"meteor-node-stubs": "^1.0.1",
"nightmare": "^3.0.2",
"pending-xhr-puppeteer": "^2.3.3",
"puppeteer": "^8.0.0",
"puppeteer-core": "^10.0.0",
"puppeteer-extra": "^3.1.18",
"puppeteer-extra-plugin-adblocker": "^2.11.11",
"puppeteer-extra-plugin-block-resources": "^2.2.9",
"puppeteer-extra-plugin-stealth": "^2.7.8"
,
【问题讨论】:
如果您尝试删除 node_modules 文件夹并再次 npm install 会发生什么? 删除 node_modules 和 npm install 后同样的问题。 您也可以发布您的package.json
吗?我的意思是只要有一个木偶师就可以了,所以我们最好看看它。
用 pacakge.json 更新了帖子
遇到同样的问题,删除 node_modules 和 npm install 对我有用
【参考方案1】:
也许你可以试试这个,它适用于我在 linux(centos)、puppeteer(10.2.0) 上。
cd ./node_modules/puppeteer
npm run install
它将铬下载到./node_modules/puppeteer/.local-chromium
【讨论】:
仅供参考,这在运行 CentOS 的 AWS 实例上也起到了作用,非常感谢【参考方案2】:我遇到了同样的问题。我检查了我的环境变量,即使 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD 设置为 false,它仍然无法正常工作。在我删除了变量(在 mac 上取消设置 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD)之后,它就起作用了。
相关依赖:
"dependencies":
"chrome-aws-lambda": "^10.0.0",
"puppeteer-core": "^10.0.0",
,
"devDependencies":
"puppeteer": "^10.0.0",
启动 Chromium:
import chromium from "chrome-aws-lambda";
const browser = await chromium.puppeteer.launch(
executablePath: await chromium.executablePath,
);
【讨论】:
【参考方案3】:抛出我的答案,希望它可以帮助人们不要像我一样浪费整个晚上。
我正在编写一个使用 Puppeteer 的 Typescript 服务器,并且我正在使用 ESBuild 从 TS 转换为 JS。在构建步骤中,esbuild 试图将所有内容捆绑到一个文件中,但我必须指示它保留从 node_modules 导入的 Puppeteer。
我通过将puppeteer
标记为外部来做到这一点。 See docs here.
由于npm i
将兼容版本的 chromium 下载到 node_modules 文件夹,一旦我保存了这个导入,它就能够在 node_modules 文件夹中找到 Chromium。
我的构建文件如下所示:
require("esbuild").buildSync(
entryPoints: ["src/index.ts"],
outdir: "build",
bundle: true,
platform: "node",
target: "node16",
external: ["puppeteer"],
);
我使用node prod-build.js
运行它。
现在在我的代码中,我可以调用 launch!const browser = await puppeteer.launch()
【讨论】:
感谢您的回答。我正在测试一个不流行的设置 - Angular Universal,其中 Express 为 REST API 和 s-s-r 提供服务。将“puppeteer”添加到服务器应用的自定义 webpack 配置的 externals 解决了这个问题!【参考方案4】:如果您在本地进行测试,请确保您已将 puppeteer 安装为开发依赖项。具体
npm install puppeteer --save-dev
https://github.com/alixaxel/chrome-aws-lambda/wiki/HOWTO:-Local-Development#workaround
这种方法使我们能够依靠 puppeteer 进行本地开发,并依靠 puppeteer-core 进行生产部署。
【讨论】:
【参考方案5】:我遇到了同样的问题。对我有用的是将 Puppeteer 使用的本地铬的完整路径指定为 executablePath
Puppeteer 启动选项。
类似这样的:
const launchOptions =
// other options (headless, args, etc)
executablePath: '/home/jack/repos/my-repo/node_modules/puppeteer/.local-chromium/linux-901912/chrome-linux/chrome'
正如another answer 中所述,似乎也可以引用 chromium 本地二进制文件,但我认为这是一个更糟糕的解决方案,因为 Puppeteer 是 guaranteed to work only with the local bundled version of Chromium。
【讨论】:
这个答案被低估了。就我而言,我不想要完整的木偶。只是 puppeteer-core 没问题,但它只是在我的 ubuntu 18 上找不到浏览器。我只需要告诉它它在哪里然后它就可以工作了。谢谢。【参考方案6】:我在我的电脑上使用了安装的版本(可能不是你要找的)
const browser = await puppeteer.launch(headless:false, executablePath:
'C:/Program Files/.../chrome.exe' );
【讨论】:
以上是关于无法在本地找到预期的浏览器 chrome的主要内容,如果未能解决你的问题,请参考以下文章
Chrome 浏览器无头问题:没有这样的元素:无法在 chrome://downloads/ 找到元素 [重复]