Nightmare.js条件浏览

我试图了解如何使用“if-then”逻辑来制作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); }); 

如何根据评估结果将这个脚本转到不同的url?

由于噩梦是可以的,你可以从.then()链接它,就像普通的Promise一样。

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

如果你想要一个更同步的逻辑,你可能要考虑使用vo或co的 generator 。 例如,上面用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'); } });