Puppeteer - 使用“--allow-file-access-from-files”通过 XMLHttpRequest 加载本地文件不起作用

Pet*_*ens 5 javascript chromium headless-browser google-chrome-headless puppeteer

我正在尝试使用通过 Puppeteer 启动的 Headless Chromium 中的本地文件。

我总是遇到以下错误:

'Cross origin requests are only supported for protocol schemes: http, data, chrome, https'
Run Code Online (Sandbox Code Playgroud)

我确实尝试过设置--allow-file-access-from-files

它可以复制如下:

const puppeteer = require('puppeteer');

puppeteer.launch({headless:true,args:['--allow-file-access-from-files']}).then(
  async browser => {
    const page = await browser.newPage();
    await page.setContent('<html><head><meta charset="UTF-8"></head><body><div>A page</div></body></html>');
    await page.addScriptTag({url:"https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"});
    await page.on('console', msg => console.log('PAGE LOG:', msg.text()));
    await page.evaluate (() => {
      $.get('file:///..../cors.js')
        .done(
           _ => console.log('done')
        ).fail(
          e => console.log('fail:'+JSON.stringify(e))
        );
    });
  await browser.close();
  }
);
Run Code Online (Sandbox Code Playgroud)

查看正在运行的进程,看起来 Chromium 确实是通过该选项启动的。

热烈欢迎所有提示!

Gra*_*ler 1

您正在尝试使用 来从页面 DOM 环境加载本地文件$.get(),这将不起作用,因为它违反了同源策略

Chromium 标志--allow-file-access-from-files描述如下:

默认情况下,file:// URI 无法读取其他 file:// URI。对于需要旧行为进行测试的开发人员来说,这是一个替代。

该标志不适用于您的场景。

您可以使用 Node.js 函数fs.readFileSync()来获取文件的内容并将其传递给page.evaluate()

const fs = require('fs');

const file_path = '/..../cors.js';
const file_content = fs.existsSync(file_path) ? fs.readFileSync(file_path, 'utf8') : '';

await page.evaluate(file_content => {
  console.log(file_content);
}, file_content);
Run Code Online (Sandbox Code Playgroud)