1

J'essaie de créer un script en utilisant nightmarejs qui pourrait cliquer sur un bouton encore et encore, comme ce bouton youtube qui est en bas de la section des commentaires et qui charge les anciens commentaires chaque fois que vous appuyez dessus (exemple: youtube.com/watch?v=pZISJqJbQuU & list = RDpZISJqJbQuU # t = 3) et s'arrête quand il n'y a plus de bouton à cliquer.Problèmes d'asynchronisme avec NightmareJS

J'ai essayé d'appeler évaluer, seulement pour que la méthode end() soit appelée en premier et annule le processus. J'ai essayé d'utiliser setTimeout, setInterval, then(), convertissant la boucle en une récursivité. A chaque fois soit evaluer() terminera son travail mais ne quittera pas (juste suspendu) ou quittera avant de terminer son travail à cause d'une condition de concurrence avec end().

Y at-il un utilisateur expérimenté de nightmarejs?

function youtube_button_clicker(group) { 
    var nightmare = Nightmare({ 
     show: true 
    }); 

    nightmare 
     .goto(url) 
     .inject('js', 'jquery-3.1.0.js') 
     .then(
      () => nightmare. 
     evaluate(function() { 
    for (i=0;i>LEN;i++) 
    { setTimeout(() => { $(button_element).click() }, i * 2000); } 


    return "done" 


})) 
.catch(function (error) { 

     console.error('Search failed:', error); 
    }); 

} 

Retirez la méthode .end() et il se bloque, mettez le .end() à nouveau et il ignore le processus - se ferme tôt. Que puis-je faire ?

+0

Votre 'setTimeouts' doivent être enveloppé dans des promesses, alors vous devez les 'promettre.all' pour que vous obteniez un événement quand tout se termine alors vous devez passer le promis retourné par 'all' à' alors' afin que vous puissiez l'enchaîner avec un autre 'then' ou 'end' il correctement – slebetman

+0

Pouvez-vous s'il vous plaît me montrer un exemple de code? – RetroCode

Répondre

1

.evaluate() Les fonctions ne peuvent pas être asynchrones, du moins pas jusqu'à ce que #819 (ou quelque chose comme ça) soit inclus. En d'autres termes, l'évaluation avec setTimeout() ne fonctionnera pas. De plus, je ne pense pas que ce serait une bonne voie à suivre dans ce cas, même si c'était possible hors de la boîte. En outre, pourrait peut aller donner par exemple dans nightmare-examples une lecture de . Il donne un bref aperçu sur le chaînage de plusieurs opérations et la mise en boucle.

Vous pourriez probablement vous en sortir avec une fonction récursive, mais vous devrez faire attention à appliquer une condition d'arrêt. (. Vous pouvez également jeter un oeil à #625, l'action défile, mais le problème est similaire) de la hanche, je pense que quelque chose comme ça pourrait vous permettre de vous rapprocher:

var iterations = 0; 
var reclick = function(nm) { 
    return nm 
    .click('#some-button') 
    .wait('#element-you-check-for') 
    .then(function() { 
     // you could also use `.visible()` or something before this `.then()` 
     // depends on your use case 
     // here, I'm using the number of iterations 
     if (iterations++ < 10) { 
     return reclick(nm); 
     } 
     return; 
    }); 
} 

nightmare 
    .goto('http://my-domain.tld') 
    .then(function() { 
    return reclick(nightmare); 
    }) 
    .then(function(){ 
    // ... other actions 
    })