phantomjs
  • webpage-rendering
  • 2013-05-31 7 views 29 likes 
    29

    मैंने अपने ऐप के वेबशॉट बनाने के लिए एक स्क्रिप्ट सेट की है। यह पूरी तरह से चलाता है और सब ठीक है जब तक मैं एक टूटी हुई यूआरएल के साथ एक छवि का सामना:phantomJS वेबपृष्ठ टाइमआउट

    "<img src='http://testserver.our.intranet/fetch/image/373e8fd2339696e2feeb680b765d626e' />" 
    

    मैं इससे पहले कि यह बस हमेशा के लिए पाशन किया गया था, नीचे का उपयोग कर 6 सेकंड के बाद स्क्रिप्ट को तोड़ने में कामयाब रहे।

    लेकिन, नेटवर्क अनुरोध (AKADOM से बाहर छवि लेने के लिए) पर ध्यान न दें और उसके बाद छवि के बिना अंगूठे बनाने के लिए, आगे बढ़ने के लिए यह संभव है (या एक इंजेक्शन छवि लापता छवि के साथ!)

    var page = require('webpage').create(), 
        system = require('system'), 
        address, output, size; 
    
    if (system.args.length < 3 || system.args.length > 5) { 
        phantom.exit(1); 
    } else { 
        address = system.args[1]; 
        output = system.args[2]; 
        page.viewportSize = { width: 640, height: 640 }; 
        page.zoomFactor = 0.75; 
        page.clipRect = { top: 10, left: 0, width: 640, height: 490 }; 
        try{ 
         page.open(address, function (status) { 
          if (status !== 'success') { 
           console.log('Unable to load the address!'); 
           phantom.exit(); 
          } else { 
           window.setTimeout(function() { 
            page.render(output); 
            phantom.exit(); 
           }, 200); 
          } 
         });  
        } finally{ 
         setTimeout(function() { 
          console.log("Max execution time " + Math.round(6000) + " seconds exceeded"); 
          phantom.exit(1); 
         }, 6000); 
        } 
    } 
    
    +0

    यह एक उत्कृष्ट सवाल है। हमें एक समान समस्या है, सिवाय इसके कि इसे हल करना थोड़ा कठिन है। हमारे पास एक ग्राहक की वेबसाइट है जिसमें कस्टम जावास्क्रिप्ट है जो खराब लिखा गया है। ऐसा लगता है कि वेबकिट लटकने का कारण बन रहा है। हमारे पास ऐसी वेबसाइटों की एक बड़ी श्रृंखला है जिसे हम परीक्षण करना चाहते हैं, लेकिन यदि ग्राहक का कस्टम जेएस वेबकिट तोड़ रहा है तो यह काम नहीं करता है। टाइमर ओबीजे एक अच्छा समाधान है, लेकिन मुझे आश्चर्य है कि किसी के पास एक अलग समाधान है या नहीं। ... – cliffbarnes

    उत्तर

    60

    फ़ैंटॉमजेएस 1.9 ने एक नई सेटिंग, resourceTimeout पेश की है, जो नियंत्रित करता है कि इसे रद्द करने से पहले अनुरोध कितना समय ले सकता है। इसके साथ-साथ, onResourceTimeout ईवेंट है जो अनुरोध समय समाप्त होने पर ट्रिगर किया जाता है।

    यहाँ एक कोड ऊपर के सभी को दर्शाता हुआ टुकड़ा है:

    var page = require('webpage').create(); 
    page.settings.resourceTimeout = 5000; // 5 seconds 
    page.onResourceTimeout = function(e) { 
        console.log(e.errorCode); // it'll probably be 408 
        console.log(e.errorString); // it'll probably be 'Network timeout on resource' 
        console.log(e.url);   // the url whose request timed out 
        phantom.exit(1); 
    }; 
    
    page.open('http://...', function (status) { 
    ... 
    } 
    

    दुर्भाग्य से उन विकल्पों खराब अभी प्रलेखित रहे हैं। मुझे उन्हें खोजने के लिए गिटहब discussions और PhantomJS source code से गुजरना पड़ा।

    +2

    संसाधन है टाइमआउट को लागू किए गए फैंटोमज प्रक्रिया को समाप्त करना था। क्योंकि मेरे लिए, यह नहीं है। प्रेतोज़ प्रक्रिया केवल अनिश्चित काल तक लटकती है। – Donato

    +0

    @ डोनाटो मुझे लगता है कि संसाधनटाइमआउट केवल कुछ ईवेंट उत्पन्न करता है, जिसे 'पेज.ऑनसोर्सटाइमआउट' – Scadge

    +1

    में कम से कम संस्करण 1.9.8 संसाधन में टाइमटाइम प्रक्रिया में बाधा डालती है - इसलिए पीडीएफ दूषित हो जाता है, लेकिन प्रक्रिया लटका नहीं है। मैं यह भी लॉग करता हूं कि किस संसाधन ने पेज.ऑनसोर्सटाइमआउट = फ़ंक्शन (अनुरोध) का उपयोग कर समस्या उत्पन्न की है ... – Gerfried

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