Quelques bonne pratiques et astuces avec nightmarejs

Compartimenter les actions

Compartimenter les actions permet de pouvoir continuer l’éxécution en cas d’erreur pour une navigation dont les actions ne sont pas dépendantes les unes des autres.

nightmare
  .goto(urlLogin)
  .wait('body')
  .then(function() {
      console.log("Récupération de l'html de la page 1");

      return nightmare
        .goto(urlPage1)
        .wait('body')
        .html('mapage1.html');
        .catch(error => {console.error('Search failed:', error)})
  })
  .then(function() {
      console.log("Récupération de l'html de la page 2");

      return nightmare
        .goto(urlPage2)
        .wait('body')
        .html('mapage2.html');
        .catch(error => {console.error('Search failed:', error)})
  })
  .then(function() {
      console.log("Récupération de l'html de la page 3");

      return nightmare
        .goto(urlPage3)
        .wait('body')
        .html('mapage3.html');
        .catch(error => {console.error('Search failed:', error)})
  })
  .then(function() {
      nightmare.end
  });

Chainer les actions qui dépendes les unes des autres

nightmare
  .goto(urlLogin)
  .wait('body')
  .then(function() {
      console.log("Screenshot de l'étape 1");

      return nightmare
        .goto(urlPage)
        .wait('#buttonNextEtape1')
        .screenshot('etape1.jpg')
        .click('#buttonNextEtape1')
        .then(function() {
            console.log("Screenshot de l'étape 2");

            return nightmare
                .wait('#buttonNextEtape2')
                .screenshot('etape2.jpg')
                .click('#buttonNextEtape2')
                .then(function() {
                    console.log("Screenshot de l'étape 3");

                    return nightmare
                        .wait('#buttonNextEtape3')
                        .screenshot('etape3.jpg')
                        .click('#buttonNextEtape3')
                        .end()
                })
        })
  })

Réaliser un «if»

nightmare
.goto(url)
.wait('body')
.exists('#monbouton') /* Test si un bouton existe et    permet d'utiliser l'existence dans la fonction then */
.then(function(exist) {
    if(!exist) {
        console.log("Le bouton n'existe pas");
        
        return nightmare;
    }
    console.log("Export html de la page après clique sur    le bouton");
    
    return nightmare
        .click('#monelement')
        .html('monfichier.html')
        .end();
})

Faire une boucle

.goto(url)
.wait('table#montableau')
.evaluate(function() {
      return $('table#montableau a').length
 })
.then(function(nbLink) {
    for(var i = 0; i < nbLink; i++) {
        console.log("Export html de la page"+i);
  
        nightmare
          .click("table#montableau :nth-child("+i+")")
          .wait('body')
          .html('mapage_'+i+'.html')
          .back()
    }
  
    return nightmare.end();
})