2017-05-29 4 views
0

J'essaie de parcourir une liste de nœuds obtenue via Nightmare.js. L'exécution dans les outils de développement fonctionne comme prévu, mais dans ElectronI ne peut pas convertir le NodeList en tableau avec succès.Electron Nightmare.js NodeList to Array

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

J'ai essayé le portage NodeList par diverses autres méthodes. Rien ne semble fonctionner à Electron. Encore une fois, ceci est facilement réalisé dans les outils chromés.

Répondre

0

Le problème est que les HTMLElements ou les nœuds sont valides dans le contexte de la page. Tout ce qui doit être passé de evaluate() à then(), est envoyé en interne en utilisant le module nightmare.ipc. Cela signifie que la valeur retournée est convertie en chaîne (JSON.stringify) et ensuite créée en retour.

Si vous vérifiez les journaux de la console du développeur, vous verrez des erreurs de conversion.

Vous pouvez évaluer la longueur dans la fonction d'évaluation elle-même et la transmettre.

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

Si vous avez besoin de passer des éléments dans différents evaluate() étapes, vous pouvez contourner, mais qui est différente histoire