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 确实是通过该选项启动的。
热烈欢迎所有提示!
您正在尝试使用 来从页面 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)
| 归档时间: |
|
| 查看次数: |
7286 次 |
| 最近记录: |