page.evaluate - 如何在其中写入文件?

时间:2015-05-13 17:20:31

标签: javascript phantomjs

如何在page.evaluate中写入结果?将结果放入console.log但使用ts引发错误写入文件时,此代码可正常工作。

page.evaluate(function(url) {
        function getHTTPResponseString(url, callback) {
            try {
                var xhr = new XMLHttpRequest();
                xhr.onload = function() {
                    if (this.status == 200) {
                        var u8 = new Uint8Array(this.response), bs = [];
                        for (var i = u8.length - 1; i >= 0; --i) {
                            bs[i] = String.fromCharCode(u8[i]);
                        }
                        callback(bs.join(''));
                    } else {
                        console.log(this.statusText);
                        callback('');
                    }
                }
                xhr.open('GET', url, true);
                xhr.responseType = 'arraybuffer';
                xhr.send();
            } catch (e) {
                console.log(JSON.stringify(e));
            }
        }
        getHTTPResponseString(url, function(result) {
            console.log(result);
        })
    }, url);

2 个答案:

答案 0 :(得分:5)

我发现可以通过调用window.callphantom()内的page.evaluate来传递数据,然后通过page.onCallback事件处理传递的数据:

page.onCallback = function(result) {
    var fs = require('fs');
    fs.write('file.out', result, 'w');
};


getHTTPResponseString(url, function(result) {
     console.log(result);
     window.callPhantom(result);
})

答案 1 :(得分:1)

无法从page.evaluate()函数内部写入文件,因为它在浏览器上下文中无法访问本地文件系统。

但是,您可以返回要分析的数据,然后在PhantomJS端处理它。

var error = page.evaluate(function(url) {
    // ...
    return xhr.statusText;
  }, url);

fs.write(filename, error, 'a');

记录数据的一种更简单的方法是使用page.onConsoleMessage函数从浏览器上下文订阅控制台消息:

page.onConsoleMessage = function (msg) {
    console.log("Browser console: " + msg);    
};   

还有一个 page.onError 函数来侦听 page.evaluate 中发生的错误:http://phantomjs.org/api/webpage/handler/on-error.html