0

我正在使用 NightmareJS 进行无头浏览。我的代码如下所示:

var Nightmare = require('nightmare');
var google = new Nightmare()
    .goto('http://www.google.com')
    .wait(3000)
    .inject('js', 'jquery.min.js')
    .screenshot('screenshot.png')
    .evaluate(function(){
        return $('#footer').html();
    }, function(value){
        console.log(value);
    })
    .run(function(err){
        console.log('All done!');
    });

我需要经常使用console.log. 但是,console.log似乎在.evaluate块内不起作用。

如何将.evaluate中的内容记录到控制台?

4

2 回答 2

1

所以我能够使用 Promises 更早地解决这个问题。这是更新的代码:

var Nightmare = require('nightmare');
var Promise = require('es6-promise').Promise;

var nightmare = new Nightmare();
Promise.resolve(nightmare
    .goto('http://www.google.com')
    .wait(3000)
    .inject('js', 'jquery.min.js')
    .screenshot('screenshot.png')
    .evaluate(function(){
        return $('#footer').html();
    }))
    .then(function(value){
        console.log(value);
        console.log('All Done!');
        return nightmare.end();
    })
    .then(function(result){
    }, function(err){
        console.error(err);
    });

记得要npm install es6-promise。除了我在这里使用的实现之外,您还可以使用其他 Javascript Promises 实现。

希望能帮助到你。

于 2015-12-21T18:48:31.503 回答
0

console.log()在页面上下文(内部evaluate())内工作正常,但你必须听它:

new Nightmare()
    .on("consoleMessage", function(msg){
        console.log("remote> " + msg);
    })
    .goto('http://www.google.com')
    .evaluate(function(){
        console.log($('#footer').html());
    }, function(){})
    ...

请记住,您不能像在您喜欢的浏览器的开发人员工具中那样将 DOM 节点完全输出到控制台。那就太多了。您必须打印您必须自己构建的 DOM 节点的表示。

您还可以以相同的方式使用PhantomJS 提供的所有其他事件,但这仅适用于 2.x 之前的 Nightmare 版本,因为从 2.x 版本开始,Electron 被用作底层浏览器,而不是 PhantomJS。

于 2015-12-19T11:14:06.657 回答