Список узлов Electron Nightmare.js в массив

Я пытаюсь пройти через NodeList, полученный через Nightmare.js. Выполнение в инструментах разработки работает, как и ожидалось, но в Electron я не могу успешно преобразовать NodeList в массив.

   nightmare
  .goto('https://www.somePage.com')
  .wait('#someID')
  .evaluate(function () {
    var links = document.querySelectorAll('div.someClass')
    return links;
  })
  .end()
  .then(function (result) {
    console.log(result); // outputs the NodeList successfully. 
    var nodesArray = Array.prototype.slice.call(result);
    console.log(nodesArray.length) // Always 0 
    })
   .catch(function (error) {
      console.error('Failed', 
      error);
    })
  

Я пробовал портировать NodeList другими способами. Ничто не работает в Electron. Опять же, это легко достигается в хромированных инструментах.


person Antecmo    schedule 29.05.2017    source источник


Ответы (1)


Проблема в том, что HTMLElements или Node допустимы в контексте страницы. Все, что нужно передать из методаvalu() в then(), отправляется внутри с помощью модуля nightclub.ipc. Это означает, что возвращаемое значение преобразуется в строку (JSON.stringify), а затем создается обратно.

Если вы проверите журналы консоли разработчика, вы увидите ошибки преобразования.

Вы можете оценить длину в самой функции оценки и передать ее.

nightmare
  .goto(url)
  .evaluate(function(selector) {
    var links = document.querySelectorAll(selector)
    return links.length;
  }, selector)
  .then(function(result) {
    console.log(result); // Outputs length.
  })
  .catch(function(error) {
    console.error('Failed', error);
  });

Если вам нужно передать элементы на разных этапах оценки (), у вас может быть обходной путь для этого, но это другая история.

person devilpreet    schedule 22.06.2017