【问题标题】:Injecting data object to window with Puppeteer使用 Puppeteer 将数据对象注入窗口
【发布时间】:2019-06-08 11:16:20
【问题描述】:

背景

我正在使用 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 页面上的窗口以便可以在页面内访问以使用数据客户端的正确方法是什么?

【问题讨论】:

  • data 变量中有哪些数据?

标签: javascript node.js puppeteer


【解决方案1】:

将对象传递给evaluate

您可以传递将被序列化为 JSON 的数据。

await page.evaluateOnNewDocument(data => { // <-- pass as parameter
  window.pdfData = data; // <-- read it here
}, data); // <-- pass as argument

将对象传递给evaluateOnNewDocument

evaluateOnNewDocument 的工作方式与evaluate 类似,但只要有新的窗口/导航/框架,它就会运行。这样,即使您导航到另一个页面,数据也会保留。

您可以在函数内部传递数据和读取。

await page.evaluateOnNewDocument(data => {
  window.pdfData = data;
}, data);

【讨论】:

  • 我继续接受您的回答并投票支持您。对不起,我出城了,刚回来。在没有任何解释的情况下提出这个问题后,我也被否决了 2 周。非常令人沮丧。谢谢你的帮助。我唯一需要更改的是在将数据分配给对象之前创建对象,window.pdfData = {};。非常感谢您的帮助。希望我们不要继续无缘无故地拒绝投票。
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2017-03-31
相关资源
最近更新 更多