document.querySelectorAll('.summary').innerText;
这在我的伪造者页面的公开功能“ docTest”中的以下代码段中引发错误,指出“ document.querySelector不是函数” 我想将特定的节点传递给每种方法,并获得包含评估结果的结果。
与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!
});
答案 0 :(得分:1)
我只是有同样的问题。问题在于page.evaluate()
函数回调必须是async
函数,而函数docTest()
在Promise
中调用时将返回page.evaluate()
。要对其进行修复,只需将async
和await
关键字添加到您的代码中即可:
await page.exposeFunction('docTest', docTest);
var result = await page.evaluate(async () => {
var summary = await docTest(document);
console.log(summary);
return summary;
});
请记住,page.exposeFunction()
将使您的函数返回Promise
,然后,您需要使用async
和await
。发生这种情况是因为您的功能不是running inside your browser,而是在您的nodejs
应用程序内部。