Page.evaluate () не будет выполняться в цепочке Promise - PullRequest
0 голосов
/ 03 января 2019

Только начал использовать 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.

РЕДАКТИРОВАТЬ: «Оценка селекторов» также не регистрируется на консоли, так что код никогда не достигает там, моя забота.

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Наконец-то все заработало.

  1. Внутренняя часть консоли будет в контексте страницы, так что это консоль страницы хрома.
  2. Нам нужно что-то вернуть из функции оценки.,Элементы DOM не будут возвращены как есть, потому что они теряют контекст вне оценки.

Это сработало:

.then(function (resp) {
    console.log('Website Loaded')
    return Page.evaluate(function () {
      return document.querySelector('.cover-heading').innerText
    })
  })
0 голосов
/ 04 января 2019

ОК, вы на правильном пути, но у вас есть несколько проблем.

Исходя из своего собственного ответа: вы заметили, что журналы консоли выполняются в контексте страницы, когда они выполняются методом evaluate.Вы правы, говоря это, но вы не правы, говоря, что вы не можете вернуть элементы DOM из метода evaluate.Вы можете просто сказать, что ваш код не совсем правильный.

Итак, что у вас есть:

.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 выполняется в браузере. не подозревает , что в вашем скрипте puppeteer существует переменная Result.Вот почему ваша переменная выводит как 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
});

Надеюсь, это поможет!

0 голосов
/ 03 января 2019

Я бы дважды проверил, что

document.getElementsByClassName('challenge-type light') 

возвращает результат.

Я полагаю, что вы используете браузер без монитора, поэтому иногда элементы могут загружаться не так, как вы ожидаете.

...