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:
gdy kliknięcie elementu powoduje obciążenie strony, a następnie chciałbym poczekać, aż nowa strona została załadowana.
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
.
W przypadku kliknięcie powoduje obciążenie strony, przewodnik
onLoadFinished
wywoła zwrotnego po stronie został załadowany.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.
Nie ma 'page.set' w PhantomJS (1 lub 2). Czy używasz jakiegoś mostu między node.js a PhantomJS? –
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