在PhantomJS中评估中未定义属性

时间:2015-02-18 10:11:15

标签: javascript node.js file phantomjs visual-web-developer

我通过将jquery包含在页面中,通过phantomjs获取网站的内容。现在我必须通过程序将它们写入文件。为此我使用了以下代码

page.onLoadFinished = (function(status) {
    if (status === 'success') {
        page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js', function() {
             page.evaluate(function() {

                var mkdirp = require('mkdirp');
                mkdirp(counter+'_folder', function(err) { 
                    var html = $('pre[data-language="html"]').html();
                    var js   = $('pre[data-language="js"]').html();
                    var css  = $('pre[data-language="css"]').html();    
                    var fs = require('fs');
                    fs.writeFile(counter+"_folder/"+"fiddle.html", html, function(err) {}); 
                    fs.writeFile(counter+"_folder/"+"fiddle.css", css, function(err) {}); 
                    fs.writeFile(counter+"_folder/"+"fiddle.js", js, function(err) {}); 
                    console.log("******* "+counter+" *************");
                });
            });
        });
    }
});

page.open(url[counter]);

现在,当我使用时,evalute方法内部发生的事情要求程序停止显示错误无法找到变量require。知道为什么会出现这种情况吗?

1 个答案:

答案 0 :(得分:1)

page.evaluate()是沙盒页面上下文。它无法访问requirepagephantom ...

此外,mkdirp是一个不能与PhantomJS一起使用的节点模块。如果要从节点使用PhantomJS,则必须使用phantom之类的桥接器。另见:Use a node module from casperjs

使用该桥接器,您必须将变量传递到外部并从那里保存:

page.open(url, function(){
    var mkdirp = require('mkdirp');
    mkdirp(counter+'_folder', function(err) { 
        page.evaluate(function() {
            var html = $('pre[data-language="html"]').html();
            var js   = $('pre[data-language="js"]').html();
            var css  = $('pre[data-language="css"]').html();    
            return [html, js, css];
        }, function(result){
            var fs = require('fs');
            fs.writeFile(counter+"_folder/"+"fiddle.html", stuff[0], function(err) {}); 
            fs.writeFile(counter+"_folder/"+"fiddle.css", stuff[1], function(err) {}); 
            fs.writeFile(counter+"_folder/"+"fiddle.js", stuff[2], function(err) {}); 
            console.log("******* "+counter+" *************");
        });
    });
});

注意:PhantomJS的fs模块没有writeFile功能。 Node和PhantomJS具有不同的执行环境。