2015-03-07 8 views
6

उदाहरण के लिए: मैं फ़ैंटॉमजेएस के साथ एक पृष्ठ खोलता हूं, एक एसिंक्रोनस स्क्रिप्ट का मूल्यांकन करता हूं (उदा। AJAX)। जब यह सफल होता है, तो मैं प्रेत संदर्भ (page.evaluate() के बाहर) को जानना चाहता हूं कि एसिंक्रोनस प्रक्रिया समाप्त हो गई है।पृष्ठ संदर्भ से प्रेत संदर्भ में किसी ईवेंट को सुनने का कोई तरीका है?

मैं setTimeout और setInteval का उपयोग नहीं करना चाहता हूं ताकि प्रक्रिया समाप्त हो जाने के प्रेत संदर्भ में निरंतर प्रतीक्षा कर सकें।

उत्तर

14

यह वही है जो onCallback and window.callPhantom() pair के लिए है।

इसलिए, यदि आप एक AJAX अनुरोध की तरह पेज संदर्भ में एक अतुल्यकालिक कॉल है, तो आप ऐसा कर सकते हैं:

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

इस का उपयोग करने के अन्य तरीके से अपने उत्पादन जावास्क्रिप्ट बनाने के लिए करने के लिए कॉल को जोड़ने के लिए है परीक्षण आसान है। यदि आप एक वेब एप्लिकेशन लिख रहे हैं तो कभी-कभी एक चयनकर्ता को खोजने के लिए जटिल होता है जो दर्शाता है कि कोई पृष्ठ पूरी तरह से लोड होने पर इंगित करता है।

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

तो फिर तुम इस तरह परीक्षण लिख सकते हैं::

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

यह एक उदाहरण है जहां ऐसी बात कर सकता है इस तरह के एक आवेदन आसान परीक्षण करने के लिए, आप पेज जावास्क्रिप्ट में कुछ इस तरह हो सकता है गतिशील रूप से जोड़ा जा सकता है: wait for angular app to be fully rendered from phantom script

+0

मैं अपने ऐप बनाने के लिए प्रेत के साथ नोड.जेएस का उपयोग कर रहा हूं। मान लीजिए कि उपयोगकर्ताओं से दो समवर्ती अनुरोध हैं। प्रत्येक अनुरोध उपरोक्त कोड को एक बार चलाता है। क्या कोई संभावना है कि पेज.ऑन पहले अनुरोध के कॉलबैक दूसरे अनुरोध के window.callPhantom() से डेटा प्राप्त करते हैं? –

+0

@MrCold वास्तव में नहीं, क्योंकि आप एक ही PhantomJS उदाहरण का उपयोग करते हुए भी दोनों अनुरोधों के लिए एक ही 'पृष्ठ' उदाहरण का उपयोग नहीं करेंगे। भले ही आप एक ही 'पृष्ठ' उदाहरण का उपयोग करते हैं, फिर भी यह संभव नहीं होगा, क्योंकि आप दो ईवेंट हैंडलर को उसी ईवेंट में पंजीकृत नहीं कर सकते हैं। परिणामों को उचित प्रतिक्रिया ऑब्जेक्ट्स पर रूट करने के लिए आपको शायद कुछ मिडलवेयर की आवश्यकता होगी। –

+0

@ArtjomB। आपके उदाहरण में 'अगर (typeof window.callPhantom == "फ़ंक्शन") {'मान लीजिए' अगर (windowof window.callPhantom ===" फ़ंक्शन ") {', तो कम केस "फ़ंक्शन"। – Grigorii

संबंधित मुद्दे

 संबंधित मुद्दे