代码之家  ›  专栏  ›  技术社区  ›  Zag Gol

Puppeter-未能将变量传递给求值函数

  •  0
  • Zag Gol  · 技术社区  · 3 年前

    我的任务是更改Mocha测试或现有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)
    
    0 回复  |  直到 3 年前
        1
  •  2
  •   Massimo Rebuglio    3 年前

    page.evaluate序列化一个函数并将其发送到pupeeter浏览器。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));