Page.evaluate()不会在Promise链中执行

时间:2019-01-03 20:46:12

标签: node.js promise puppeteer

刚开始使用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

可能是什么错误?希望没有异步/等待的解决方案。

编辑:“评估选择器”也未登录到控制台,因此代码从未到达控制台。

3 个答案:

答案 0 :(得分:0)

我会仔细检查

document.getElementsByClassName('challenge-type light') 

返回结果。

我相信您使用的是无头浏览器,因此有时元素可能无法按预期加载。

答案 1 :(得分:0)

事情终于解决了。

  1. 内部评估控制台将在页面上下文中,所以这是Chrome页面的控制台。
  2. 我们需要从评估函数返回一些信息。 DOM元素不会按原样返回,因为它们会在评估之外失去上下文。

这有效:

.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
});

希望这会有所帮助!