通常我会用

await page.evaluateOnNewDocument(my_js_code);
其中my_js_code类似于:
Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", ...
但是问题是,在此之后代码变得可见
console.log(HTMLCanvasElement.prototype.toBlob.toString());
使用 native 函数时,代码不可见,toString返回[native code],而不是实际代码
因此,有没有一种方法可以让我用Pupeteer在更深层次上覆盖一个函数?

最佳答案

这个问题实际上与puppeteer无关,请尝试在chrome repl中运行您的代码(它将产生相同的结果)。 Object.defineProperty不接受值作为第三个参数,而是“描述符”。我猜你把函数放在第三个参数中

Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", () => {
  console.log('toBlob!');
});
但它想要这样
Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", {
  value: () => {
    console.log('toBlob!');
  }
});
对我有用的示例代码:https://gist.github.com/dralletje/37d0fc8a564ad377d60881d7c7429f6b

09-20 18:15