【问题标题】:Exposed function querySelector not working in Puppeteer公开的函数 querySelector 在 Puppeteer 中不起作用
【发布时间】:2020-03-05 10:59:28
【问题描述】:
document.querySelectorAll('.summary').innerText;

这会在下面的 sn-p 中引发错误,在我的 Puppeteer 页面暴露的函数 docTest 中说“document.querySelector 不是函数”。

我想将特定节点传递给每个方法并在evaluate 中获取结果。

document.getElemenetbyId 相同。

const puppeteer = require('puppeteer');
//var querySelectorAll = require('query-selector');


let docTest = (document) => {
var summary = document.querySelectorAll(.summary).innerText;
console.log(summary);
return summary;
}

let scrape = async () => {

const browser = await puppeteer.launch({
    headless: false
});
const page = await browser.newPage();

await page.goto('http://localhost.com:80/static.html');
await page.waitFor(5000)
await page.exposeFunction('docTest', docTest);

var result = await page.evaluate(() => {
    var resultworking = document.querySelector("tr");
    console.log(resultworking);
    var summary  = docTest(document);
    console.log(resultworking);
    return summary;

});
console.log(result);

await page.waitFor(7000);
browser.close();
return {
    result
}
};

scrape().then((value) => {
console.log(value); // Success!
});

【问题讨论】:

    标签: node.js puppeteer google-chrome-headless


    【解决方案1】:

    我也有同样的问题。问题是page.evaluate() 函数回调必须是async 函数,而您的函数docTest()page.evaluate() 内部调用时将返回Promise。要修复它,只需将 asyncawait 关键字添加到您的代码中:

    await page.exposeFunction('docTest', docTest);
    
    var result = await page.evaluate(async () => {
        var summary = await docTest(document);
        console.log(summary);
        return summary;
    });
    

    请记住page.exposeFunction() 将使您的函数返回Promise,然后,您需要使用asyncawait。发生这种情况是因为您的函数不是running inside your browser,而是在您的nodejs 应用程序中。

    1. exposeFunction() does not work after goto()
    2. Why can't I access 'window' in an exposeFunction() function with Puppeteer?
    3. How to use evaluateOnNewDocument and exposeFunction?
    4. exposeFunction remains in memory?
    5. Puppeteer: pass variable in .evaluate()
    6. Puppeteer evaluate function
    7. allow to pass a parameterized funciton as a string to page.evaluate
    8. Functions bound with page.exposeFunction() produce unhandled promise rejections
    9. How to pass a function in Puppeteers .evaluate() method?
    10. How can I dynamically inject functions to evaluate using Puppeteer?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2011-06-20
      相关资源
      最近更新 更多