每当我试图传递一个函数时,就像这样:
var myFunc = function() { console.log("lol"); };
await page.evaluate(func => {
func();
return true;
}, myFunc);
我得到:
(node:13108) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Evaluation failed: TypeError: func is not a function
at func (<anonymous>:9:9)
(node:13108) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
为什么?怎么做才正确?
谢谢你,谢谢你
让我澄清一下:我这样做是因为我想先找到一些DOM元素,然后在函数中使用它们,更像这样(简化):
var myFunc = function(element) { element.innerHTML = "baz" };
await page.evaluate(func => {
var foo = document.querySelector('.bar');
func(foo);
return true;
}, myFunc);
5条答案
按热度按时间qpgpyjmq1#
You cannot pass a function directly into
page.evaluate()
, but you can call another special method (page.exposeFunction
), which expose your function as a global function (also available in as an attribute of your pagewindow
object), so you can call it when you are insidepage.evaluate()
:Just remember that
page.exposeFunction()
will make your function return aPromise
, then, you need to useasync
andawait
. This happens because your function will not be running inside your browser, but inside yournodejs
application.yizd12fk2#
类似的问题已经在 puppet 戏issue中讨论过。
有几种方法可以处理你的问题。第一条规则是保持简单。
计算函数
这是最快的方法,您只需传递函数并执行它。
预先公开函数
您可以使用page.evaluate或page.addScriptTag预先公开该函数
使用元素句柄
页.$(选择器)
您可以将项目控制代码传递给。evaluate,并视情况进行变更。
页.$eval
您可以将一个元素作为目标,然后根据需要进行更改。
诀窍是read the docs并保持简单。
kx7yvsdv3#
使用参数传递函数
//手动添加并向窗口公开
//然后调用上面声明的函数
66bbxpm54#
cotxawn75#
我喜欢evaluateOnNewDocument,因为我想确保我的脚本代码在其他任何事情之前运行。
例如,如果要查找总阻塞时间Web重要信息:
您也可以从父作用域向函数传递参数。请参阅上面的文档链接。