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

时间:2021-03-16 12:26:02

标签: javascript mocha.js 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)

1 个答案:

答案 0 :(得分:2)

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));