2016-05-19 1 views
1

J'utilise Nightmare.js (v2.3.3) pour automatiser une partie de mon flux de travail où je dois accéder à un site Web qui met à jour notre base de données. J'ai pu faire fonctionner Nightmare pour des choses de base comme .type, .click, et .screenshot pour valider que j'accède à ces pages et que je saisis les informations que je voulais.Est-il possible de passer des informations du navigateur à la portée du nœud en utilisant Nightmare.js (v2 Electron)?

Où j'ai été bloqué, et la documentation semble manquer, utilise .evaluate pour extraire des informations de la page. Dans la documentation, il a comme:

.evaluate(fn [,arg1,arg2,...]) 

var selector = 'h1'; 
var text = yield nightmare 
    .evaluate(function (selector) { 
    // now we're executing inside the browser scope. 
    return document.querySelector(selector).innerText; 
    }, selector); // <-- that's how you pass parameters from Node scope to browser scope 

Tout cela est bien beau, mais est-il réellement possible d'aller la direction opposée et transmettre des informations de portée du navigateur vers le nœud champ? Ce que je voudrais faire est de retourner toutes les cases d'une page en tant que tableau, puis de les parcourir dans le script Nightmare. J'ai aussi cherché parmi de nombreux problèmes GitHub et questions StackOverflow pour trouver une réponse, et le problème semble être que les versions précédentes ont été construites à partir de PhantomJS et v2 + utilise Electron, il est donc difficile de distinguer quelles réponses s'appliquent encore à la version actuelle. Here est une réponse qui a semblé avoir du sens pour moi, mais c'était en 2014 donc je pense que c'était probablement une version de PhantomJS. Pour référence, voici l'extrait qui semblait avoir une réponse sur la façon de transférer du navigateur à la portée du Noeud:

var p1=1, 
    p2 = 2; 

nightmare 
    .evaluate(function(param1, param2){ 
     //now we're executing inside the browser scope. 
     return param1 + param2; 
    }, function(result){ 
     // now we're inside Node scope again 
     console.log(result); 
    }, p1, p2 // <-- that's how you pass parameters from Node scope to browser scope 
) //end evaluate 
    .run(); 

Mais il ne semble pas que la version actuelle de Nightmare prend en charge ce format .evaluate(fn, cb, arg1, arg2,...)?

Je voudrais juste savoir si c'est possible avant que je me rends fou! Merci pour toute aide, s'il vous plaît laissez-moi savoir si vous avez besoin d'informations supplémentaires pour aider à répondre.

+0

Je ne comprends pas. Dans votre premier extrait, 'text' devrait contenir la valeur qui a été transmise du contexte de la page au contexte du noeud, n'est-ce pas? Le fait? –

+0

@ArtjomB. pas de ma compréhension. 'Cédez au cauchemar 'commence juste l'instance de cauchemar pour suivre la chaîne d'instructions. – rynjwssl

Répondre

3

Vous êtes très, très proche. L'une des mises à jour les plus récentes utilise Nightmare d'une manière plus prometteuse. Cela signifie que vous n'avez pas à gérer vous-même le rappel .evaluate(), les résultats sont transmis dans la chaîne. Votre deuxième exemple, légèrement modifié:

nightmare = require('nightmare')(); 
nightmare.goto('http://example.com'); 

var p1=1, 
    p2=2; 

nightmare 
    .evaluate(function(param1, param2){ 
     return param1 + param2; 
    }, p1, p2) 
    .then(function(result){ 
    console.log(result); //prints 3 
    }); 

Il vous est conseillé d'utiliser .then(), mais si vous vraiment voulez utiliser .run(), vous pouvez:

nightmare = require('nightmare')(); 
nightmare.goto('http://example.com'); 
var p1=1, 
    p2=2; 

nightmare 
    .evaluate(function(param1, param2){ 
     return param1 + param2; 
    }, p1, p2) 
    .run(function(err, result){ 
    console.log(result); 
    }); 
+0

Merci @Ross! Je regardais en fait les problèmes de GitHub et suis tombé sur quelques-unes de vos réponses qui m'ont présenté '.then' et promesses. Un concept totalement nouveau pour moi mais je comprends pourquoi Nightmare est allé dans cette direction. Donc, le paramètre passé à '.then' est la valeur de retour de la tâche précédente dans la chaîne, dans ce cas' .evaluate'? Aussi, qu'est-ce que '.run'? Je n'ai pas trouvé de documentation pour ça ailleurs, et n'est-ce pas la meilleure pratique pour Nightmare? – rynjwssl

+1

Oui, les paramètres de la fonction '.then()' seront les résultats de l'action précédente. (C'est un peu trop simplifié, mais ça marche bien ici.) '.run()' n'est pas documenté car il a été lentement déprécié. Si vous êtes curieux, la conversation à ce sujet peut être trouvée [ici] (https://github.com/segmentio/nightmare/issues/575). – Ross

+0

Merci beaucoup pour l'aide! Je me cognais la tête contre le mur pendant une semaine en essayant de régler ça. Je vais devoir faire un peu plus de lecture dans Promises et «alors» pour comprendre son plein potentiel.Je viens de définir la vôtre comme la réponse acceptée, j'espère que cela peut aider les autres qui commencent tout juste avec Nightmare. – rynjwssl