我想用{/ p>抓取元素value
的{{1}}
#result
但它仍然记录以下错误:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://dolartoday.com');
await console.log(page.evaluate(() => document.getElementById('result')));
await browser.close();
})();
关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
首先,您尝试在await
(一个同步函数)上而不是console.log()
(一个异步函数)上使用page.evaluate()
运算符。
您还尝试将Page DOM元素返回到Node.js环境,该环境将不起作用,因为page.evaluate()
期望返回serializable。
如果您想返回网页上value
元素的#result
,则应按照以下方式重写逻辑:
console.log(await page.evaluate(() => document.getElementById('result').value));
此外,导航时间已超过30000毫秒(默认最大值)。您可以使用page.goto()
函数中的timeout
选项来延长最大导航时间:
await page.goto('https://dolartoday.com', {
timeout: 60000,
});
您还可以使用page.setRequestInterception()
和page.on('request')
拒绝不必要的资源加载到网页中。这将使您的网页加载更快:
await page.setRequestInterception(true);
page.on('request', request => {
if (['image', 'stylesheet', 'font'].indexOf(request.resourceType()) !== -1) {
request.abort();
} else {
request.continue();
}
});
您的最终程序应如下所示:
'use strict';
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', request => {
if (['image', 'stylesheet', 'font'].indexOf(request.resourceType()) !== -1) {
request.abort();
} else {
request.continue();
}
});
await page.goto('https://dolartoday.com', {
timeout: 60000,
});
console.log(await page.evaluate(() => document.getElementById('result').value));
await browser.close();
})();