【发布时间】:2019-01-04 22:05:04
【问题描述】:
刚开始使用 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
可能是什么错误?更喜欢没有 async/await 的解决方案。
编辑:“评估选择器”也没有记录到控制台,所以代码永远不会到达那里,这是我的担心。
【问题讨论】:
-
你确定 document.getElementsByClassName('challenge-type light') 真的返回结果吗?
-
不要使用那些全局的
Browser、Page、Result变量。有many much better ways to access previous promise results in a.then()chain! -
我上次检查时,
page.evaluate不支持闭包。尽量不要给Result赋值,而是给return赋值。 -
... 返回一个 serializable 值。如果传递给
page.evaluate()的函数返回一个不可序列化的值,则page.evaluate()解析为未定义。 Ref