2016-06-16 12 views
5

Próbuję zrozumieć, jak powinienem wykonać skrypt nightmare.js za pomocą logiki "jeśli-to". Na przykład:Przeglądanie warunkowe 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); 
    }); 

Jak zrobić ten skrypt, aby przejść do innego adresu URL w zależności od wyniku oceny?

Odpowiedz

10

Ponieważ Nightmare jest then stanie, możesz go zwrócić z .then(), aby połączyć go jak zwykłe obietnice.

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); 
    }); 

Jeśli chcesz więcej logiki synchronicznej wyglądających, można rozważyć użycie generators z vo lub co. Na przykład powyższe zostało ponownie przepisane za pomocą 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'); 
    } 
});