在node js中,我使用playwright打开一个浏览器页面,用一些html设置内容,然后截取它的屏幕截图.该html包含图像标签,并且IMG的src是本地文件.在截图中,我没有看到当地的图片.是否禁用本地文件访问?如果是,如何启用它?我使用了文件名的相对路径和绝对路径.如果我使用网址,则会显示图像. 我使用的是Mac OS.

async function screenShot() {
  
     const browser = await chromium.launch();
    const context = await browser.newContext();
    const page = await context.newPage();
    await page.setViewportSize({ width:200, height:200 });
    await page.setContent(`
<html><body>
        <div id="container">
        <h1>HELLO</h1>
                <img  src="file:///resources/image.png" />
            </div></body>
            </html>
    `)

    await page.locator("#container").screenshot({ path: 'screenshot.png' });

    // Teardown
    await context.close();
    await browser.close();
}

输出图像-

screenshot

推荐答案

出于安全原因,浏览器不能像这样从文件系统读取数据.有flags to disable it, but I'd use those as a last resort个.

一种 Select 是运行Web服务器来托管站点,并为图像和其他静态assets资源 提供服务.这可以通过使用Python,或者使用PHPhttp-server Node package即可完成.当您启动Web项目时,许多IDE都会为您运行服务器.

对于Python.html,把你的超文本标记语言移到index.html中,并从包含index.html的目录中运行python3 -m http.server,在浏览器中访问http://localhost:8000时验证图像加载,然后使用page.goto("http://localhost:8000")并像往常一样自动化网站.

另一种方法是将图像作为Base64注入原始的HTML中,绕过浏览器请求.下面是一个最小的例子:

const {chromium} = require("playwright"); // ^21.0.2
const fs = require("node:fs/promises");

let browser;
(async () => {
  const b64 = await fs.readFile("test.png", {encoding: "base64"});
  browser = await chromium.launch({headless: false});
  const page = await browser.newPage();
  await page.setContent(`<!DOCTYPE html>
    <html>
    <body>
      <h1>hello world</h1>
      <img src="data:image/png;base64,${b64}" alt="hello world">
    </body>
    </html>
  `);
  await page.screenshot({path: "test_out.png", fullPage: true});
  await browser.close();
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close())

Node.js相关问答推荐

Windows上使用ES6+的OpenAPI规范的Express服务器不接受嵌套路由'

MongoDB:更新批量操作中许多不能正常工作的内容

Mongoose-如何从父文档填充到子文档

使用Node.js中的";类型";:";模块";不导入文件

后端如何保护数据不被用户提取其他用户的数据?

FiRestore UPDATE方法引发错误:&Quot;错误:13内部:收到代码为1&Quot;的RST_STREAM

填充函数在Node.js和MongoDB中不起作用

try 插入重复的邮箱时,mongoDB DuplicateKey 错误未定义

如何在nodejs中打印pdf

Gulp 能否向 Docker 发出增量构建的第一次迭代完成的信号?

如何在套接字对象中存储或添加数据?

我应该如何解决这个 Angular node 包模块依赖冲突?

module.exports=require('other') 和临时变量有什么区别?

如何解决 npm install react-select failure with error : An unknown git error occurred, git@github.com :Permission denied (publickey)

使用中的端口代码:'EADDRINUSE',即使在 kill 命令之后

为什么 req.params.id 返回 undefined未定义?

为什么模块级返回语句在 Node.js 中起作用?

如何仅在丢失的路由上将 Express.js 设置为 404?

Node.js:如何附加到正在运行的进程并使用控制台调试服务器?

请求新页面时如何将 AngularJS 路由与 Express (Node.js) 一起使用?