2013-07-10 34 views
35

Tôi đang cố gắng thiết lập gỡ lỗi từ xa bằng PhantomJS, mà không có nhiều may mắn. Tôi đang làm theo hướng dẫn tại https://github.com/ariya/phantomjs/wiki/Troubleshooting. Tôi có một chương trình nhỏ có tên debug.js:Bắt gỡ lỗi từ xa được thiết lập với PhantomJS

var system = require('system'), fs = require('fs'), webpage = require('webpage'); 

(function(phantom){ 
    var page=webpage.create(); 

    function debugPage(){ 
     console.log("Refresh a second debugger-port page and open a second webkit inspector for the target page."); 
     console.log("Letting this page continue will then trigger a break in the target page."); 
     debugger; // pause here in first web browser tab for steps 5 & 6 
     page.open(system.args[1]); 
     page.evaluateAsync(function() { 
      debugger; // step 7 will wait here in the second web browser tab 
     }); 
    } 
    debugPage(); 
}(phantom)); 

Bây giờ tôi chạy từ dòng lệnh:

$ phantomjs --remote-debugger-port=9001 --remote-debugger-autorun=yes debug.js my.xhtml 

Các thông điệp console.log tại được hiển thị trong cửa sổ shell. Tôi mở một trang trình duyệt tới localhost:9001. Đó là vào thời điểm này tài liệu nói rằng "có được thanh tra web đầu tiên cho bối cảnh ảo" Tuy nhiên, tôi chỉ thấy một mục duy nhất cho about:blank. Khi tôi nhấp vào đó, tôi sẽ có một thanh tra viên không liên quan về: trang trống, với URL http://localhost:9001/webkit/inspector/inspector.html?page=1. Tài liệu thảo luận về việc thực hiện __run(), nhưng tôi dường như không thể truy cập trang mà tôi sẽ làm điều đó; about:html dường như contina a __run() là một no-op.

FWIW, tôi đang sử dụng PhantomJS 1.9.1 trong W8.

Tôi đang thiếu gì?

+0

tôi sử dụng [này] (http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examples. html) để chuyển tiếp cổng cục bộ tới cổng máy chủ web từ xa thay thế. –

Trả lời

23

Các tài liệu nói:

To run your script, simply enter the __run() command in the Web Inspector Console.

__run() không phải là một không-op nhưng chỉ là một wrapper để kịch bản của bạn. Trước tiên, bạn cần chọn tab Console và sau đó nhập __run() trong cửa sổ lệnh. Nếu bạn quen thuộc với Chrome, nó khá giống với công cụ phát triển.

debug console

+3

Bạn cũng có thể thực hiện --remote-debugger-autorun = yes theo https://github.com/ariya/phantomjs/wiki/Troubleshooting – AlexMA

+2

Cảm ơn! Chết tiệt _double underscore_ trước __run() không thể dễ dàng nhìn thấy trên trang tài liệu khắc phục sự cố ... http://phantomjs.org/troubleshooting.html – JMax

+1

Tôi tiếp tục nhận được lỗi "Uncaught ReferenceError: __run không được định nghĩa (…) " – Mardok

21

Để gỡ lỗi một kịch bản, bắt đầu phantomjs như vậy:

phantomjs --remote-debugger-port=9000 hello.js 

Dưới đây là một kịch bản thử nghiệm siêu đơn giản mà làm việc (hello.js). Lưu ý rằng bạn nên đặt "trình gỡ rối"; ở đầu tập lệnh của bạn hoặc bất kỳ vị trí nào trong tập lệnh bạn muốn đột nhập vào trình gỡ lỗi.

debugger; 

for (var i=0; i < 5; i++) 
{ 
    console.log('debugging in phantom js:' + i); 
} 

phantom.exit(); 

Bây giờ chỉ cần nạp url sau trong trình duyệt của bạn:

http://127.0.0.1:9000/ 

Sau đó, bạn sẽ thấy một liên kết được liệt kê trong trang trình duyệt

about:blank 

Bấm vào nó, và sau đó bạn sẽ thấy toàn bộ trang trông giống như Trình kiểm tra Chrome. Nhấp vào nút "Bảng điều khiển" trong thanh công cụ trong trang này (không phải bảng điều khiển của Chrome hoặc Safari mà bạn đã quen sử dụng).

Bây giờ, trong loại bảng điều khiển đó "__run()" và nhấn enter. Kịch bản của bạn sẽ hiển thị và bắt đầu gỡ lỗi!

10

Tôi gặp sự cố khi gỡ lỗi để hoạt động trên Mac sử dụng Chrome phiên bản 57.0.2987.133 (64 bit). Tôi đã gỡ lỗi để mở trên localhost: 9000 (127.0.0.1:9000 đã không làm việc cho tôi) nhưng sau khi nhập __run() (có, với đôi gạch dưới), không có phản ứng. Tôi có thể thấy các tệp js khác theo Nguồn, danh sách của tôi được liệt kê nhưng trống. (Tôi đã bật gỡ lỗi bằng chrome)

Tôi đã thử tương tự trên safari và tất cả đều hoạt động như quảng cáo.

CẬP NHẬT dành cho Chrome: (từ Thiago Fernandes dưới đây): Rõ ràng vấn đề này là do Chrome không chấp nhận nhập chìa khóa, vì vậy cách giải quyết là để đánh giá chức năng này bên trong chrome console, để có được làm việc enterKey:

function isEnterKey(event) { return (event.keyCode !== 229 && event.keyIdentifier === "Enter") || event.keyCode === 13; } 
+0

Trên chrome một giải pháp là cần thiết https://github.com/ariya/phantomjs/issues/12864#issuecomment-279612178 –

+0

Cảm ơn Thiago nhưng cách giải quyết khác hơn là cài đặt phiên bản cũ của chrome là gì? Trong trường hợp đó tôi sẽ chỉ sử dụng safari. –

+2

Giải pháp thay thế này là đánh giá chức năng này bên trong bảng điều khiển chrome, do đó enterKey hoạt động: '' 'function isEnterKey (event) { return (event.keyCode! == 229 && event.keyIdentifier ===" Enter ") || event.keyCode === 13; } '' ' –

1

Trong trường hợp của tôi, __run() sẽ không được thực thi trong bảng điều khiển. Nếu đây là cùng một vấn đề mà bạn có, hãy đọc tiếp ....

mở PowerShell và thực thi kịch bản:

cls 
# we go to the folder where our test.js script resides 
cd "C:\Users\xxx\Phantomjs.Console" 
phantomjs --remote-debugger-port=9000 --remote-debugger-autorun=yes test.js 
  1. Mở trình duyệt Chrome của bạn và đi đến
  2. http://localhost:9000
  3. Nhấp vào tệp của bạn trong tệp test.js của tôi.
  4. Chuyển sang tab Nguồn!
  5. Thực hiện __run() trong Biểu thức xem!

Đặt câu lệnh debugger trong tập lệnh của bạn để gỡ lỗi!

enter image description here

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