page.evaluate - 如何写入文件里面呢?

page.evaluate - how to write to file inside of it?

如何将 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);

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

但是你可以 return 你想要分析的数据,然后在 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

我发现可以通过在 page.evaluate 内部调用 window.callphantom() 来传递数据,然后通过 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);
})