2013-09-16 91 views
5

Tôi mới dùng Javascript và PhantomJS, nhưng mục tiêu dường như đơn giản của tôi đã chứng minh là khó đạt được hơn mong đợi. Tôi muốn viết một kịch bản có thể tải một trang web, và sau đó xuất ra giá trị của một biến Javascript được sử dụng trên trang đó. Nếu tôi mở trang đó trong trình duyệt và mở bảng điều khiển Javascript, tôi có thể nhập tên biến và nó cho tôi biết giá trị được liên kết với biến đã nói. Tôi chỉ cố gắng để tái tạo chức năng này nhưng với PhantomJS để tôi có thể tự động hóa nhiệm vụ này.Đọc biến javascript từ trang web bằng cách sử dụng PhantomJS

Ai đó có thể chỉ cho tôi tài liệu phù hợp về điều này? Tôi đã không thể tìm thấy cách làm một điều như vậy, giả sử PhantomJS là đúng cách để làm điều này. Có lẽ có một lựa chọn đơn giản hơn?

Cảm ơn.

+1

Một trong những điều sau đây có thể giúp bạn: https://github.com/ariya/phantomjs/wiki/API-Reference-WebPage#wiki-webpage-evaluate hoặc https://github.com/ariya/phantomjs/wiki/API-Reference-WebPage # onconsolemessage –

Trả lời

15

Điều bạn cần hiểu là phantomJS có hai môi trường JavaScript và hai môi trường này độc lập với nhau. Phần bên trong là kịch bản tài liệu (bạn có trong bất kỳ trình duyệt nào). Cái bên ngoài là kiểm soát những gì phantomJS nên làm. Nó mô phỏng người dùng.

Vì vậy, theo nghĩa nào đó, bạn cần phải thông báo cho phantomJS "người dùng đã mở bảng điều khiển JavaScript bất kỳ được nhập ...". evaluate command thực hiện điều này.

Vì vậy, để đọc các giá trị của biến foo, bạn viết mã này:

var foo = page.evaluate(function() { 
    return document.foo; 
}); 

Lưu ý: Các document là không thực sự cần thiết nhưng nó giúp để giữ cho hai môi trường ngoài vào đầu của nhà phát triển .

+0

Tôi đã có thể làm điều này để làm việc, tôi không có ý tưởng bạn có thể đánh giá các biến toàn cầu về "phía bên kia" tuyệt vời như thế nào! Toàn bộ thời gian này tôi đã in ra thông tin trên các bảng trên màn hình và sau đó đánh giá các bảng để có được thông tin, điều này hiệu quả hơn rất nhiều! –

3

Câu trả lời của Aaron không phù hợp với tôi. Có lẽ nó đã trở lại hợp lệ vào năm 2013, nhưng bây giờ (2016), nó không hoạt động nữa với phiên bản hiện tại. Trong ví dụ của Aaron, foo trả về một lời hứa, không phải là một giá trị. console.log(foo) kết quả đầu ra Promise { <pending> }.

Đây là những gì tôi đã tìm ra:

page 
    .evaluate(function(){ return window.foo }) 
    .then (function(foo){ console.log "foo = ", foo}); 

Bây giờ bạn thực sự có được giá trị của foo.