2016-02-28 10 views
7

Używam opcji PhantomJS 2 do klikania elementów strony. Nie wiem jednak, czy kliknięcie tych elementów wywoła zdarzenie (np. Ładowanie strony).PhantomJS 2: Wykrywanie kliknięcia, które nie spowodowało zdarzenia

Chciałbym być w stanie obsłużyć oba przypadki:

  1. gdy kliknięcie elementu powoduje obciążenie strony, a następnie chciałbym poczekać, aż nowa strona została załadowana.

  2. Gdy kliknięcie nie wyzwala wydarzenia, chciałbym móc je rozpoznać (bez konieczności oczekiwania na długi czas oczekiwania).

W PhantomJS 1, może po prostu skorzystać z zamknięciem tak:

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); 
} 

Tutaj mam zamknięciu ponad zmiennej loading który działa jako „kanał łączności” między funkcje obsługi zdarzeń i funkcja w setTimeout.

  1. W przypadku kliknięcie powoduje obciążenie strony, przewodnik onLoadFinished wywoła zwrotnego po stronie został załadowany.

  2. Jeśli kliknięcie nie uruchamia ładowania strony, funkcja w setTimeout wywoła wywołanie zwrotne po zaledwie 100 ms (co jest dopuszczalne).

Ten kod działa dobrze pod PhantomJS 1.

Pod PhantomJS 2 niestety, obsługi zdarzeń dla onLoadStarted i onLoadFinished nie może uzyskać dostępu do zmiennej loading już (tzn nie działają jako zamknięcia, jak się wydaje).

Więc zastanawiam się, jak mogę osiągnąć to samo zachowanie w PhantomJS 2. Jakieś pomysły?

PS: Jestem świadomy, że muszę zainstalować obsługi zdarzeń poprzez page.property(...) w PhantomJS 2 zamiast używania page.set(...) jak w PhantomJS 1.

Edit: Używam fantom pakietu węzeł (https://www.npmjs.com/package/phantom) jako pomost między węzłem & phantomjs.

+0

Nie ma 'page.set' w PhantomJS (1 lub 2). Czy używasz jakiegoś mostu między node.js a PhantomJS? –

+0

Ah, tak, rzeczywiście - używam phantom pakietu węzłów (https://www.npmjs.com/package/phantom). Oczywiście zapomniałem o tym wspomnieć;). Zastanawiam się jednak, w jaki sposób może być zaangażowany w rozwiązanie mojego problemu opisanego powyżej ...czy to rzeczywiście jest problem z tym mostem węzła zamiast z samym phantomjs? – Oliver

Odpowiedz

0

Rozwiązaniem dla mnie było zrezygnowanie z mostu węzłowego i użycie czystych phantomjs. Prowadzi to do następnego odpowiedniego kodu do pracy jak urok, nawet z 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); 
} 
Powiązane problemy