2015-03-07 12 views

Odpowiedz

14

To jest dokładnie to, do czego służy onCallback and window.callPhantom() pair.

Tak więc, jeśli masz asynchroniczne wywołanie w kontekście widoku podobnego żądania AJAX, można to zrobić:

page.onCallback = function(data){ 
    console.log("finished: " + data.text); 
    phantom.exit(); 
}; 
page.evaluate(function(){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", "/"); 
    xhr.onreadystatechange = function() { 
     var DONE = this.DONE || 4; 
     if (this.readyState === DONE){ 
      window.callPhantom({text: this.responseText}); 
     } 
    }; 
    xhr.send(); 
}); 

Innym sposobem wykorzystania tego celu jest dodanie połączenia do produkcji JavaScript, żeby uczynić testowanie łatwiejsze. Jeśli piszesz aplikację internetową, czasami trudno jest znaleźć selektor oznaczający, kiedy strona jest w pełni załadowana. Aby testowanie takiego wniosku łatwiej, można mieć coś takiego w widoku javascript:

finishOffPage(function callback(){ 
    if (typeof window.callPhantom === "function") { 
     window.callPhantom({type: "loadFinished"}); 
    } 
}); 

Następnie można pisać testy tak:

page.onCallback = function(data){ 
    if (data.type === "loadFinished") { 
     // do some testing 
    } 
}; 
page.open(url); 

To jest przykład, gdzie coś takiego można dynamicznie dodawana: wait for angular app to be fully rendered from phantom script

+0

Używam Node.js wraz z fantomem do tworzenia aplikacji. Przypuśćmy, że istnieją dwa jednoczesne żądania od użytkowników. Każde żądanie uruchamia powyższy kod jeden raz. Czy istnieje możliwość, że page.onCallback pierwszego żądania otrzyma dane z window.callPhantom() z drugiego żądania? –

+0

@MrCold Niezupełnie, ponieważ nie używałbyś tej samej instancji 'page' dla obu żądań, nawet jeśli używasz tej samej instancji PhantomJS. Nawet jeśli użyjesz tej samej instancji 'page', nadal nie będzie to możliwe, ponieważ nie możesz zarejestrować dwóch programów obsługi zdarzeń dla tego samego zdarzenia. Prawdopodobnie będziesz potrzebować jakiegoś oprogramowania pośredniego, aby skierować wyniki do odpowiednich obiektów odpowiedzi. –

+0

@ArtjomB. w twoim przykładzie 'if (typeof window.callPhantom ==" Function ") {przypuszczalnie być' if (typeof window.callPhantom === "function") {', więc małe litery" funkcja ". – Grigorii

Powiązane problemy