刚开始使用Puppeteer。尝试解析页面,但评估方法无法正常工作。
var Browser
var Page
var Result
puppeteer.launch()
.then(function (browser) {
console.log('Browser Created\nCreating Blank Page')
Browser = browser
return Browser.newPage()
})
.then(function (page) {
console.log('Page Created\nVisiting URL')
Page = page
return Page.goto(URL)
})
.then(function (resp) {
console.log('Website Loaded')
return Page.evaluate(function () {
// Completely Sync Stuff
console.log('Evaluating Selectors')
var myElems = document.getElementsByClassName('challenge-type light')
Result = myElems
})
})
.then(function (val) {
console.log(Result)
console.log('Done! Exiting')
Browser.close()
process.exit()
})
.catch(function (err) {
Browser.close()
console.log(err)
process.exit(1)
})
输出:
Browser Created
Creating Blank Page
Page Created
Visiting URL
Website Loaded
undefined
Done! Exiting
可能是什么错误?希望没有异步/等待的解决方案。
编辑:“评估选择器”也未登录到控制台,因此代码从未到达控制台。
答案 0 :(得分:0)
我会仔细检查
document.getElementsByClassName('challenge-type light')
返回结果。
我相信您使用的是无头浏览器,因此有时元素可能无法按预期加载。
答案 1 :(得分:0)
事情终于解决了。
这有效:
.then(function (resp) {
console.log('Website Loaded')
return Page.evaluate(function () {
return document.querySelector('.cover-heading').innerText
})
})
答案 2 :(得分:0)
好的,您走的路正确,但是有一些问题。
根据您自己的回答:您注意到控制台日志在evaluate
方法中执行时在页面上下文中执行。您的说法是正确的,但您不能通过evaluate
方法返回DOM元素,这是不正确的。您可以只是代码不太正确。
所以你有这个:
.then(function (resp) {
console.log('Website Loaded')
return Page.evaluate(function () {
// Completely Sync Stuff
console.log('Evaluating Selectors')
var myElems = document.getElementsByClassName('challenge-type light')
Result = myElems
})
})
.then(function (val) {
console.log(Result)
console.log('Done! Exiting')
});
这不起作用,因为您试图在myElems
方法内将Result
分配给evaluate
变量。 evaluate
方法在浏览器中执行。 不知道,您的Result
脚本中存在一个puppeteer
变量。这就是为什么变量最后输出为undefined
的原因。
解决方法如下:
.then(function () {
return Page.evaluate(function () {
// Return the array of elements from inside the evaluate method
return document.getElementsByClassName('challenge-type light')
});
})
.then(function (elements) {
console.log(elements) // Will be your array of elements
});
希望这会有所帮助!