2013-03-27 21 views
23

Từ PhantomJS, làm cách nào để ghi vào nhật ký thay vì giao diện điều khiển?PhantomJS/Javascript: ghi vào tệp thay vì để bàn điều khiển

Trong ví dụ https://github.com/ariya/phantomjs/wiki/Examples, nó luôn luôn (trong những cái tôi đã xem xét) nói cái gì đó như:

console.log('some stuff I wrote'); 

Đây không phải là rất hữu ích.

+0

Bạn hãy thử sử dụng HTML FileSystem API như bạn trong trình duyệt bình thường? – Valentin

Trả lời

13

Vì vậy, tôi figured it out:

>phantomjs.exe file_to_run.js > my_log.txt 
+11

trong khi tác phẩm này hoạt động, nó cũng sẽ ghi nội dung có khả năng không mong muốn vào tệp như lỗi javascripts và các lỗi phantomj khác. Bạn tốt hơn với câu trả lời của Arun để bạn có thể kiểm soát * chính xác * những gì được viết. – zoltar

+5

không ghi vào tệp bằng cách sử dụng phantomjs. đó chỉ là chuyển hướng tiêu chuẩn stdout, và do đó không phải là câu trả lời cho câu hỏi. – oligofren

+1

tốt để xem nhanh chóng và bẩn của các thông điệp console.log mặc dù. –

41

Sau đây có thể viết nội dung vào file trực tiếp bởi phantomjs:

var fs = require('fs'); 
    try { 
    fs.write("/home/username/sampleFileName.txt", "Message to be written to the file", 'w'); 
    } catch(e) { 
     console.log(e); 
    } 
    phantom.exit(); 

Lệnh trong câu trả lời của user984003 thất bại khi có một số cảnh cáo hoặc đã xảy ra trường hợp ngoại lệ. Và đôi khi không rơi vào yêu cầu cụ thể của chúng tôi bởi vì trong một số codebase tôi luôn nhận được thông báo sau cũng sẽ được ghi vào tệp đó.

Refused to display document because display forbidden by X-Frame-Options. 
9

Bạn có thể ghi đè lên chức năng console.log gốc, hãy xem này:

Object.defineProperty(console, "toFile", { 
    get : function() { 
     return console.__file__; 
    }, 
    set : function(val) { 
     if (!console.__file__ && val) { 
      console.__log__ = console.log; 
      console.log = function() { 
       var fs = require('fs'); 
       var msg = ''; 
       for (var i = 0; i < arguments.length; i++) { 
        msg += ((i === 0) ? '' : ' ') + arguments[i]; 
       } 
       if (msg) { 
        fs.write(console.__file__, msg + '\r\n', 'a'); 
       } 
      }; 
     } 
     else if (console.__file__ && !val) { 
      console.log = console.__log__; 
     } 
     console.__file__ = val; 
    } 
}); 

Sau đó, bạn có thể làm điều này:

console.log('this will go to console'); 
console.toFile = 'test.txt'; 
console.log('this will go to the test.txt file'); 
console.toFile = ''; 
console.log('this will again go to the console'); 
+0

Điều này là rất tốt vì điều này sẽ không chỉ đưa đầu ra phantom.js vào tệp mà còn tất cả các mục console.log khác, làm cho nó có thể tự gỡ rối các bài kiểm tra. Một bổ sung sẽ là (vẫn) cũng xuất ra giao diện điều khiển bằng cách thêm dòng 'console .__ log __. Apply (console, arguments);' sau 'fs.write()' do đó cho phép đầu ra giao diện điều khiển bình thường được xử lý bình thường Người chạy CI. – Gyuri

+0

Một điều nữa: dòng 'fs.write' hôm nay là ' fs.writeFileSync (console .__ file__, msg + '\ r \ n', {flag: 'a'}); ' – Gyuri

Các vấn đề liên quan