#javascript #node.js #puppeteer
#javascript #node.js #puppeteer
Вопрос:
Обычно я бы сделал это с
await page.evaluateOnNewDocument(my_js_code);
где my_js_code — это что-то вроде:
Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", ...
Но проблема в том, что после этого код становится видимым
console.log(HTMLCanvasElement.prototype.toBlob.toString());
С помощью встроенной функции код не виден, возвращает toString [native code]
, а не фактический код
Итак, есть ли способ переопределить функцию на более глубоком уровне с помощью Puppeteer?
Ответ №1:
Проблема на самом деле не в 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
Ответ №2:
Собственный код означает, что он реализован в браузере, возможно, на языке, отличном от Javascript. Когда вы предоставляете тело функции, это будет не собственный код, а функция, которую вы определили.
Я не думаю, что есть способ определить код, который консоль devtools будет выводить как собственный код, и даже если бы он был, он только запутал бы то, что он делает, и не смог бы скрыть это.
Ответ №3:
Итак, я обнаружил, что это, похоже, своего рода «эмулирует» поведение собственной функции:
Object.defineProperty(HTMLCanvasElement.prototype.toBlob, "toString", {
"value": function () {
return 'function toBlob() { [native code] }';
}
});
Не уверен, есть ли какие-либо побочные эффекты, хотя