2016-02-28 18 views
7

Tôi đang sử dụng PhantomJS 2 để nhấp vào các thành phần của trang. Tuy nhiên, tôi không biết liệu nhấp chuột vào các yếu tố này có kích hoạt sự kiện hay không (ví dụ: tải trang).PhantomJS 2: Phát hiện nhấp chuột không kích hoạt sự kiện

Tôi muốn để có thể xử lý cả hai trường hợp:

  1. Khi một nhấp chuột vào một yếu tố gây nên một tải trang sau đó tôi muốn đợi cho đến khi trang mới đã được tải.

  2. Khi nhấp chuột không kích hoạt sự kiện, tôi muốn có thể nhận ra điều đó (mà không phải chờ một thời gian chờ lâu).

Trong PhantomJS 1, tôi chỉ đơn giản có thể làm cho việc sử dụng một kết thúc như thế này:

function click(page, elem, callback) { 
    var loading = false; 

    page.set('onLoadStarted', function() { 
    loading = true; 
    }); 

    page.set('onLoadFinished', function() { 
    callback('click triggered page load'); 
    }); 

    triggerClick(page, elem); 

    setTimeout(function() { 
    if (! loading) { 
     callback('click did not trigger page load'); 
    } 
    }, 100); 
} 

Ở đây tôi đang đóng trên biến loading đóng vai trò như một "kênh thông tin liên lạc" giữa xử lý sự kiện và chức năng trong setTimeout.

  1. Trong trường hợp nhấp chuột kích hoạt tải trang, trình xử lý onLoadFinished sẽ gọi lại cuộc gọi sau khi trang đã được tải.

  2. Trong trường hợp nhấp chuột không kích hoạt tải trang, chức năng trong setTimeout sẽ gọi lại cuộc gọi sau chỉ 100ms (có thể chấp nhận được).

Mã này đã làm việc tốt dưới PhantomJS 1.

Dưới PhantomJS 2 không may, các trình xử lý sự kiện cho onLoadStartedonLoadFinished không thể truy cập các biến loading nữa (tức là họ không làm việc như đóng cửa nữa như nó có vẻ).

Vì vậy, bây giờ tôi tự hỏi làm thế nào tôi có thể đạt được hành vi tương tự trong PhantomJS 2. Bất kỳ ý tưởng?

PS: Tôi biết rằng tôi phải cài đặt các trình xử lý sự kiện thông qua page.property(...) trong PhantomJS 2 thay vì sử dụng page.set(...) như trong PhantomJS 1.

Sửa: Tôi đang sử dụng ma gói nút (https://www.npmjs.com/package/phantom) làm cầu nối giữa nút & phantomjs.

+0

Không có 'page.set' trong PhantomJS (1 hoặc 2). Bạn đang sử dụng một số loại cầu nối giữa node.js và PhantomJS? –

+0

Ah, vâng - tôi đang sử dụng gói phantom (https://www.npmjs.com/package/phantom). Rõ ràng là quên đề cập đến điều đó;). Tuy nhiên, tôi đang tự hỏi về cách mà có thể được tham gia vào một giải pháp cho vấn đề của tôi mô tả ở trên ...thực sự là một vấn đề với cầu nút này thay vì với chính các phantomj? – Oliver

Trả lời

0

Giải pháp cho tôi thực ra là từ bỏ cây cầu nút và thay vào đó sử dụng các phantomj tinh khiết. kết quả trong các mã tương ứng sau này để làm việc như một nét duyên dáng, ngay cả với PhantomJS 2:

function click(page, elem, callback) { 
    var loading = false; 

    page.onLoadStarted = function() { 
    loading = true; 
    }; 

    page.onLoadFinished = function() { 
    callback('click triggered page load'); 
    }; 

    triggerClick(page, elem); 

    setTimeout(function() { 
    if (! loading) { 
     callback('click did not trigger page load'); 
    } 
    }, 100); 
} 
Các vấn đề liên quan