Puppeteer - 未能将变量传递给评估函数

如何解决Puppeteer - 未能将变量传递给评估函数

我的任务是更改背景代码或现有 Mocha 测试以与 Puppeteer 一起运行。这是测试,不应更改

return assertOnLeft(function (asserter) {
            asserter(window.location.href.indexOf("http://XXXX:3000/regression_test_pages/links_page1.html") == 0,"Address should be links_page.html");
});

我尝试实现 assertOnLeft 函数

const assertOnLeft = async (predicate) => {
    const assert = require("assert");

    const asserterOk = assert.ok;
    await page.evaluate((asserterOk,predicate) => {
        return predicate(asserterOk)
    },asserterOk,predicate)
    .catch((e) => console.log("error",e));
}

但我收到一个错误

error Error: Evaluation Failed: TypeError: predicate is not a function
at __puppeteer_evaluation_script__:2:16
at ExecutionContext._evaluateInternal (/node_modules/puppeteer/lib/cjs/puppeteer/common/ExecutionContext.js:218:19)
at processticksAndRejections (internal/process/task_queues.js:97:5)
at async ExecutionContext.evaluate (/node_modules/puppeteer/lib/cjs/puppeteer/common/ExecutionContext.js:107:16)
at async assertOnLeft (/var/tmp/regression_tests/puppeteer/testWrapper.js:143:5)

解决方法

page.evaluate 序列化一个函数并将其发送到 puppeeter 浏览器。 page.evaluate 中的代码不是您代码的一部分,您不能从中调用代码的函数。

如果您想要一个“棘手”的解决方案,您不能尝试 exposeFunction...但通常不是一个好方法。如果您发布预测的代码,我可以为您提供更好的方法

试试这个:

const assert = require("assert");

const asserterOk = assert.ok;

await page.exposeFunction("predicted",predicted);

await page.evaluate((asserterOk,predicate) => {
    return predicted(asserterOk,predicate)
},asserterOk,predicate)
    .catch((e) => console.log("error",e));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?