2016-10-27 2 views
6

NightmareJS fonctionne très bien lorsque j'exécute une évaluation, mais lorsque j'interagis avec la page, je dois faire plus d'évaluations au fur et à mesure que les choses passent. Cependant, l'utilisation des documents que j'ai essayé un simple échantillon de enchaînant des évaluations et je reçois une erreur:Plusieurs évaluations de NightmareJS

describe('test google search results', function() { 
    this.timeout(15000); 
    it('should find the nightmare github link first', function(done) { 
    var nightmare = Nightmare({show: true}) 
    nightmare 
     .goto('http://google.com') 
     .wait(1000) 
     .type('form[action*="/search"] [name=q]', 'github nightmare') 
     .click('form[action*="/search"] [type=submit]') 
     .wait(1000)//.wait('#rcnt') 
     .evaluate(function() { 
     return document.querySelector('div.rc h3.r a').href 
     }) 
     .then(function(link) { 
     console.log("TESTING 1"); 
     expect(link).to.equal('https://github.com/segmentio/nightmare'); 
     }) 
     .wait() 
     .evaluate(function() { 
     return document.querySelector('div.rc h3.r a').href 
     }) 
     .end() 
     .then(function(link) { 
     console.log("TESTING 2"); 
     expect(link).to.equal('https://github.com/segmentio/nightmare'); 
     done(); 
     }) 
    }); 
}); 

Erreur:

TypeError:. Nightmare.goto (...) attendre (...) de type. (...). cliquez sur (...). wait (...). evaluate (...). then (...). wait n'est pas une fonction

Dans ce cas j'ai ajouté une attente avant la prochaine évaluation au cas où je devrais laisser le système attendre une complète mais quand même cela ne fonctionne pas.

Répondre

6

Le fait est que evaluate() renvoie un Promise, qui est une chose Javascript et pas une chose Nightmare. Donc une promesse a then et catch, entre autres méthodes, mais n'a clairement pas une méthode wait.

Je pense this répondre et ce resource peut vous aider à mieux comprendre le concept.

Appliquer le concept à votre scénario, le code ressemblerait à ceci

describe('test google search results', function() { 
    this.timeout(15000); 
    it('should find the nightmare github link first', function(done) { 
    var nightmare = Nightmare({show: true}) 

    nightmare 
     .goto('http://google.com') 
     .wait(1000) 
     .type('form[action*="/search"] [name=q]', 'github nightmare') 
     .click('form[action*="/search"] [type=submit]') 
     .wait(1000)//.wait('#rcnt') 
     .evaluate(function() { 
     return document.querySelector('div.rc h3.r a').href 
     }) 
     .then(function(link) { 
     console.log("TESTING 1"); 
     expect(link).to.equal('https://github.com/segmentio/nightmare'); 

     nightmare.evaluate(function() { 
      return document.querySelector('div.rc h3.r a').href 
     }) 
     .end() 
     .then(function(link) { 
      console.log("TESTING 2"); 
      expect(link).to.equal('https://github.com/segmentio/nightmare'); 
      done(); 
     }) 

     }).catch(function(error) { 
     done(new Error(error)) 
     }) 
    }); 
}); 

Remarquez comment le deuxième appel à evaluate est à l'intérieur du premier rappel then.

+0

Merci beaucoup pour votre aide, après avoir testé un peu plus, je recevais encore quelques erreurs jusqu'à ce que je découvre que je devais charger au lieu d'attendre de chai. –

+0

Après avoir regardé cela plus en détail, il semble que ce sera un bordel à gérer quand je dois écrire 100 tests imbriqués, y at-il un plus élégant pour écrire des évals imbriqués? Je pensais nourrir une promesse, mais cela pourrait ne pas fonctionner si la promesse devait être imbriquée. –

+0

Après un peu plus de tests, j'ai trouvé la solution suivante: http://stackoverflow.com/questions/40297378/nightmarejs-multiple-reports-from-same-test/40298901#40298901 Cela me permet de garder la séparation que je besoin pour le moment. –