Puppeteer 屏幕截图缺少/不可见文本

2023-12-24

我正在使用 puppeteer 保存和下载由浏览器发送到 Express 应用程序的标记和 css 中的图像。 Express 编译模板,只需将 POSTed 标记插入 html shell 并在本地获取 css(安装在 docker 卷上)。

当我直接在 chrome 中渲染 html 和 css 时,所有文本和其他元素都会按预期显示。然而,保存的屏幕截图缺少文本。

当我省略样式时,文本在本地镶边和 puppeteer 保存的图像中以相同的方式呈现。

幕后是否有设定的风格?还有什么可以解释这种差异吗?

EDIT:现在看来,它可能与我的代码中某处未处理的竞争条件有关。在不进行任何更改的情况下,我能够获得预期的图像,但只是有时,而且我还无法弄清楚那些时间有什么不同。

重现步骤

  • 傀儡师版本:0.12.0
  • 平台/操作系统版本:docker/ubuntu
  • Node.js 版本:8

索引.js:

app.post('/img', function (req, res) {
  const puppeteer = require('puppeteer');
  let css = [];
  let stylesheets = [];
  // 
  // separate out local stylesheets and read contents of the files
  // 
  css = req.body.stylesheets.filter(sheet => {
    return sheet.indexOf('https') === -1 && sheet.indexOf('http') === -1;
  });
  css = css.map(sheet => {
    return fs.readFileSync(path.join(__dirname, sheet));
  });
  // 
  // separate out external stylesheets (bootstrap, etc)
  // 
  stylesheets = req.body.stylesheets.filter(sheet => {
    return sheet.indexOf('https') > -1 || sheet.indexOf('http') > -1;
  });
  //
  // compile template with html & styles
  //
  app.render('img', {
    stylesheets: stylesheets,
    content: req.body.content,
    css: css
  }, function (err, html) {
    console.log('html\n', html);
    (async() => {
      const browser = await puppeteer.launch({args: ['--no-sandbox']});
      const page = await browser.newPage();
      await page.setViewport({width: 1300, height: 1200});
      //
      // load html to chrome
      //
      try {
        const loaded = page.waitForNavigation({
          waitUntil: 'load'
        });
        await page.setContent(html);
        await loaded
      } catch(err) {
        console.log(err);
        res.status(err.status).send('There was an error loading the page.');
      }
      //
      // save image
      //
      const filename = `${req.body.title}.png`;
      const filepath = path.join(__dirname, 'img', filename);
      try {
        await page.screenshot({ path: filepath });
        console.log(`${filename} saved`);
      } catch(err) {
        console.log(err);
        res.status(err.status).send('There was a problem saving the image.');
      }
      res.status(201).send(filename);
    })();
  });
});

img.html(模板):

<!DOCTYPE html>
<html>
<head>
  <title>{{title}}</title>
  {{#stylesheets}}
  <link rel="stylesheet" type="text/css" href="{{{.}}}">
  {{/stylesheets}}
  {{#css}}
  <style type="text/css">
    {{{.}}}
  </style>
  {{/css}}
</head>
<body>
  {{{content}}}
</body>
</html>

Expected

Without local styles: chrome without styles

With local styles: chrome with styles

Actual

没有本地风格是预料之中的。

With local styles: puppeteer, with styles


您的 docker 映像可能没有必要的字体。那里有很多开源图像(我在这里维护一个:https://github.com/joelgriffith/browserless https://github.com/joelgriffith/browserless)尝试缓解此类常见问题。

这主要是由于基础图像没有合适的字体。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Puppeteer 屏幕截图缺少/不可见文本 的相关文章

随机推荐

  • 使用画布的 3D 立方体。需要一点改进

    我使用以下代码制作了这个 3d 立方体 Matrix mMatrix canvas getMatrix canvas save camera save camera rotateY angle camera getMatrix mMatri
  • Python 字符串与字节数组之间的转换

    如何将人类可读的字符串转换为字节数组并返回 假设我有 Hello World 并且想要一个字节数组 然后从字节数组到相同的字符串 您可以使用bytearray https docs python org 2 library function
  • 将 collections.deque 转换为 python 列表的算法复杂度是多少?

    我试图确定将 collections deque 对象转换为 python 列表对象的复杂度是 O n 我想它必须获取每个元素并将其转换为列表 但我似乎找不到双端队列背后的实现代码 那么 Python 是否在幕后内置了一些更高效的东西 可以
  • nlp - 如何检测句子中的单词是否指向颜色/身体部位/车辆

    因此 正如标题所示 我想知道句子中的某个单词是否指向 1 一种颜色 The grass is green 因此 绿色 是颜色 2 身体的一部分 Her hands are soft 因此 手 是身体的一部分 3 车辆 I am drivin
  • 循环数据提取所有以 .co.uk 结尾的电子邮件地址

    我试图通过应对以下挑战来提高我的编程 PHP 技能 接下来的问题并不是关于代码问题 也不是我要求代码问题 而是关于应该应用的编程逻辑 9 email protected cdn cgi l email protection 0 0 1 1
  • 远程访问HDFS

    我有hadoop服务器在某些服务器上运行 比如说IP 192 168 11 7 其 core site xml 如下
  • DataTable 服务器端仅在我有少量数据时才工作

    我正在从 json 加载传递到有关数据表表的服务器端处理 我有两种环境 一种用于测试 一种用于生产 它们具有相同的功能和数据库结构 当我在测试环境中测试新进程时 脚本加载数据没有任何问题 5行 相同的脚本不会在生产环境中加载数据 1200
  • 使用opencv读取带有type_id opencv-image的xml文件

    嘿 我在读取 type id opencv image 的 xml 文件时尝试了很多搜索 我在这里查找的只是 opencv matrix 所有可用的帮助对我来说都是无用的 请帮我从 xml 文件中读取图像矩阵 我将 xml 文件的上半部分粘
  • 如何循环这个CSS滑块动画?

    我正在尝试创建一个 css 滑块 到目前为止我只成功地让它正确迭代一次 有没有办法让它无限循环而不改变最终结果 div class slider div class slides div class slider 1 div div cla
  • 如何获取匹配源的JRE/JDK?

    我希望在我的 Windows 计算机上获得至少一个 JRE JDK 级别 其中我的 JRE JDK 源与 JRE JDK 的确切级别相匹配 我的目的是能够在调试时进入系统类 关于如何执行此操作有什么建议吗 提前致谢 大多数有用的源代码都位于
  • MongoDB查询,通过userID查找所有

    这是我的数据库中 客户 的结构 id oid xxxxx user oid xxxxx name Test Mobile email null phone xxxxx completed false v 0 我正在尝试查询具有特定 user
  • 如何使用 Moment 正确处理 Bing 中的“/Date(...-0700)/”日期格式?

    我正在使用 它以这种格式返回日期 Date 1538245980000 0700 它看起来像以毫秒为单位的 Unix 时间戳 后面跟着一个时区 此刻文档声称能够正确处理这些 https momentjs com docs parsing a
  • ReactJS 和 DRF:如何将 JWT 令牌存储在 HTTPonly cookie 中?

    目前 我的 Web 应用程序可以使用登录功能 在发出登录请求后 服务器会使用包含 2 个令牌的 JSON 对象进行响应 这是登录功能 async function login const data email email protected
  • 文本块不会更新

    我有一个TextBlock caloriesAvailableTextBlock 我正在尝试更新 这Button eatCaloriesButton 应该减少的数量TextBlock的约束为 100 但是 TextBlock不会更新 它仍然
  • AngularJS 窗口内宽尺寸更改事件

    我正在寻找一种方法来观察窗口内部宽度尺寸变化的变化 我尝试了以下方法但没有成功 scope watch window innerWidth function console log window innerWidth 有什么建议么 我们可以
  • Visual Studio致命错误LNK1120:

    只是我想使用 Visual Studio 2010 制作一个程序 当我构建时我有这个例外 我刚刚编写了空的主 C 程序 没有语法错误 我得到的是 1 gt LINK error LNK2001 unresolved external sym
  • 淘汰赛不同步手动设置选项的选定属性

    我正在使用这个 jQuery 插件来实现多选列表框http www quasipartikel at multiselect http www quasipartikel at multiselect 并且所有这些都使用 knockoutj
  • 在 Redis 中存储 numpy 数组的最快方法

    我在一个人工智能项目中使用 redis 这个想法是让多个环境模拟器在许多 CPU 核心上运行策略 模拟器将经验 状态 操作 奖励元组列表 写入 Redis 服务器 重播缓冲区 然后 训练过程将经验读取为数据集以生成新策略 新策略将部署到模拟
  • ASP.NET 默认文档

    我有default aspx和index html 我将两者都上传到服务器 但我希望我的第一页以index html 开头 我应该怎么办 如果您无权访问 IIS 并且托管在 IIS 7 Windows Server 2008 上 您可能需要
  • Puppeteer 屏幕截图缺少/不可见文本

    我正在使用 puppeteer 保存和下载由浏览器发送到 Express 应用程序的标记和 css 中的图像 Express 编译模板 只需将 POSTed 标记插入 html shell 并在本地获取 css 安装在 docker 卷上