PhantomJS中的evalute内部未定义属性

Properties are undefined inside of evalute in PhantomJS

本文关键字:未定义 属性 内部 evalute 中的 PhantomJS      更新时间:2023-12-25

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

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时,程序在那里停止,显示错误找不到变量require。知道为什么会出现这种情况吗?

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

此外,mkdirp是一个节点模块,不能与PhantomJS一起使用。如果您想从节点使用PhantomJS,则必须使用类似phantom的桥接。另请参阅:使用来自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有不同的执行环境。