2013-09-30 3 views
5

यह स्क्रिप्ट काम करता है:PhantomJS: काम कर setContent नहीं जब एचटीएमएल संपत्ति

var page = require('webpage').create(); 

var html = '<h1>Test</h1><img>'; //works with page.setContent and page.content 
//var html = '<h1>Test</h1><img src=".">'; //only works with page.content 

page.setContent(html, 'http://github.com'); 
//page.content = html; 

page.render('test.png'); 
phantom.exit(); 

लेकिन जोड़ने img करने के लिए एक src विशेषता यह चुपचाप असफल बनाता है (page.render रिटर्न false और कोई छवि उत्पन्न होता है)।

page.content सेट करना सीधे दोनों मामलों में काम करता है लेकिन फिर संबंधित यूआरएल नहीं करते हैं। वही बात अन्य टैग्स के साथ होती है जो link जैसे संसाधन लोड करते हैं। इससे कोई फर्क नहीं पड़ता कि लिंक किया गया संसाधन मौजूद है या नहीं। 1.8.1 और 1.9.2 में परीक्षण किया गया।

क्या यह एक बग है या मैंने एपीआई को गलत समझा है?

+0

से अधिक https://github.com/ariya/phantomjs/issues/11656 – Tamlyn

उत्तर

4

यदि आप पूरी तरह से लोड नहीं होते हैं तो आप वेबपृष्ठ प्रस्तुत नहीं कर सकते हैं।

जब आप लिंक या src से <img> सेट कर रहे हैं, तो यह छवि को असीमित रूप से लोड करने का प्रयास करेगा। तो, इसे लोड होने के लिए प्रतीक्षा करने की आवश्यकता है।

कोड का पालन करने का प्रयास करें।

page.onLoadFinished = function(status) { 
    page.render('test.png'); 
    phantom.exit(); 
}; 
page.setContent(html, 'http://github.com'); 
+0

पर यह वेब पृष्ठों को एक के लिए लूप ऐसा लगता है में बनाए जाते हैं सब करता है, तो पर नहीं बुलाया जाता है एक मुद्दे के रूप में प्रकाशित किया गया था। मैं आपके दृष्टिकोण के साथ पीएनजी को एसवीजी का बैच रूपांतरण करने में असमर्थ था, हालांकि यह एक फ़ाइल के लिए पूरी तरह से काम करता था। – CoDEmanX

+0

@CoDEmanX: बैच प्रोसेसिंग के लिए आप हमेशा अपने फ़ंक्शन को कॉल कर सकते हैं 'loadNextSVG() 'बजाय' phantom.exit() 'जो पृष्ठ में नए एसवीजी संदर्भ को सेट करता है और उसी' ऑनलोड लोडेड 'को अगले एसवीजी पर जाने के लिए बुलाया जाएगा। फॉर-लूप के बिना लूप बनाने का एक तरीका। आशा करता हूँ की ये काम करेगा। –

+0

धन्यवाद, यह वास्तव में काम करता है। हालांकि, 'ऑनलोड लोडेड' कॉलबैक ('page.render() 'के लिए आवश्यक आउटपुट फ़ाइल नाम) पर जानकारी पास करने के लिए मुझे वैश्विक चर का उपयोग करने की आवश्यकता है। इसके अलावा, 'listdir()' द्वारा लौटाई गई अमान्य फ़ाइलों को छोड़ना मुश्किल हो जाता है, क्योंकि कोड रिकर्सिव दृष्टिकोण के कारण गन्दा हो जाता है। – CoDEmanX

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