2016-06-16 40 views
5

Sto cercando di capire come dovrei creare uno script nightmare.js utilizzando la logica "if-then". Ad esempioNavigazione condizionale di Nightmare.js

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ 
    show: true, 
    paths: { 
     userData: '/dev/null' 
    } 
}); 

nightmare 
    .goto('http://www.example.com/') 
    .wait('h1') 
    .evaluate(function() { 
     return document.querySelector('title').innerText; 
    }) 
    // here: go to url1 if title == '123' otherwise to url2 
    .end() 
    .then(function() { 
     console.log('then', arguments); 

    }).catch(function() { 
     console.log('end', arguments); 
    }); 

Come si imposta questo script in un URL diverso a seconda del risultato della valutazione?

risposta

10

Poiché Nightmare è then in grado, è possibile restituirlo da un .then() in modo da incatenarlo come si farebbe con le normali promesse.

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ 
    show: true, 
    paths: { 
    userData: '/dev/null' 
    } 
}); 

nightmare 
    .goto('http://www.example.com/') 
    .wait('h1') 
    .evaluate(function() { 
    return document.querySelector('title') 
     .innerText; 
    }) 
    .then(function(title) { 
    if (title == 'someTitle') { 
     return nightmare.goto('http://www.yahoo.com'); 
    } else { 
     return nightmare.goto('http://w3c.org'); 
    } 
    }) 
    .then(function() { 
    //since nightmare is `then`able, this `.then()` will 
    //execute the call chain described and returned in 
    //the previous `.then()` 
    return nightmare 
     //... other actions... 
     .end(); 
    }) 
    .then(function() { 
    console.log('done'); 
    }) 
    .catch(function() { 
    console.log('caught', arguments); 
    }); 

Se si vuole una logica più sincrona di aspetto, si può prendere in considerazione l'utilizzo generators con vo o co. Ad esempio, quanto sopra riscritto con vo:

var Nightmare = require('nightmare'); 
var vo = require('vo'); 

vo(function *() { 
    var nightmare = Nightmare({ 
    show: true, 
    paths: { 
     userData: '/dev/null' 
    } 
    }); 

    var title = yield nightmare 
    .goto('http://www.example.com/') 
    .wait('h1') 
    .evaluate(function() { 
     return document.querySelector('title') 
     .innerText; 
    }); 

    if (title == 'someTitle') { 
    yield nightmare.goto('http://www.yahoo.com'); 
    } else { 
    yield nightmare.goto('http://w3c.org'); 
    } 

    //... other actions... 

    yield nightmare.end(); 
})(function(err) { 
    if (err) { 
    console.log('caught', err); 
    } else { 
    console.log('done'); 
    } 
});