无法在本地找到预期的浏览器 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浏览器不能打开本地pdf文件了

表格宽度在 Firefox html 上无法按预期工作

Chrome 浏览器无头问题:没有这样的元素:无法在 chrome://downloads/ 找到元素 [重复]

无法通过移动浏览器访问本地主机上的 Wordpress 站点(Chrome devtools - 远程设备)

Chrome浏览器本地安装插件

Chrome浏览器数据本地备份