使用 Puppeteer 将数据对象注入 window
Injecting data object to window with Puppeteer
背景
我正在使用 Puppeteer 创建一些 PDF。我需要在 Puppeteer 加载页面时将一些数据注入页面。
问题
我曾尝试使用 evaluateOnNewDocument()
,仅在使用 String
时成功。当我尝试使用 Object
时,它失败了。我也尝试过 evaluate()
,但无论我传入什么,它都会失败。
示例
// Works
await page.evaluateOnNewDocument(() => {
window.pdfData = {};
window.pdfData = "Some String";
});
// Does not work
await page.evaluateOnNewDocument(() => {
window.pdfData = {};
window.pdfData = data;
});
// Fails
await page.evaluate(data => {
window.pdfData = {};
window.pdfData = data;
}, data);
我想像这样访问这个对象,
const data = window.pdfData;
问题
在加载的 Puppeteer 页面上将数据对象传递到 window 以便可以在页面内访问它以使用数据客户端的正确方法是什么?
正在将对象传递给 evaluate
您可以传递将序列化为 JSON 的数据。
await page.evaluateOnNewDocument(data => { // <-- pass as parameter
window.pdfData = data; // <-- read it here
}, data); // <-- pass as argument
正在将对象传递给 evaluateOnNewDocument
evaluateOnNewDocument
与 evaluate
的工作方式类似,除了它会 运行 只要有新的 window/navigation/frame。这样,即使您导航到另一个页面,数据也会保留。
您可以在函数内部传递数据和读取。
await page.evaluateOnNewDocument(data => {
window.pdfData = data;
}, data);
背景
我正在使用 Puppeteer 创建一些 PDF。我需要在 Puppeteer 加载页面时将一些数据注入页面。
问题
我曾尝试使用 evaluateOnNewDocument()
,仅在使用 String
时成功。当我尝试使用 Object
时,它失败了。我也尝试过 evaluate()
,但无论我传入什么,它都会失败。
示例
// Works
await page.evaluateOnNewDocument(() => {
window.pdfData = {};
window.pdfData = "Some String";
});
// Does not work
await page.evaluateOnNewDocument(() => {
window.pdfData = {};
window.pdfData = data;
});
// Fails
await page.evaluate(data => {
window.pdfData = {};
window.pdfData = data;
}, data);
我想像这样访问这个对象,
const data = window.pdfData;
问题
在加载的 Puppeteer 页面上将数据对象传递到 window 以便可以在页面内访问它以使用数据客户端的正确方法是什么?
正在将对象传递给 evaluate
您可以传递将序列化为 JSON 的数据。
await page.evaluateOnNewDocument(data => { // <-- pass as parameter
window.pdfData = data; // <-- read it here
}, data); // <-- pass as argument
正在将对象传递给 evaluateOnNewDocument
evaluateOnNewDocument
与 evaluate
的工作方式类似,除了它会 运行 只要有新的 window/navigation/frame。这样,即使您导航到另一个页面,数据也会保留。
您可以在函数内部传递数据和读取。
await page.evaluateOnNewDocument(data => {
window.pdfData = data;
}, data);